Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LargeFileUploadTask.upload() throws a 400 error when file size is smaller than max_chunk_size #718

Open
itsmariodias opened this issue Nov 23, 2024 · 0 comments
Labels
status:waiting-for-triage An issue that is yet to be reviewed or assigned type:bug A broken experience

Comments

@itsmariodias
Copy link

itsmariodias commented Nov 23, 2024

Describe the bug

While uploading a large file using LargeFileUploadTask to a SharePoint drive location, if the overall file size is less than the max_chunk_size defined (e.g uploading a 5 KB file but the chunk size is 10 MB), the async LargeFileUploadTask.upload() method uploads the file but throws below error:

APIError:
        APIError
        Code: 400
        message: The server returned an unexpected status code and no error class is registered for this code 400

Expected behavior

The upload task should complete without any errors OR the error message should be meaningful e.g. File is too small.

How to reproduce

destination_path = "path/to/your_file.txt" # path on SharePoint drive where I want to upload the file
file_path = "path/to/your_file.txt" # A small file like 10 KB in my local system

async def upload_large_file(graph_client, drive_id):
    try:
        file = open(file_path, 'rb')
        uploadable_properties = DriveItemUploadableProperties(
            additional_data={'@microsoft.graph.conflictBehavior': 'replace'}
        )
        upload_session_request_body = CreateUploadSessionPostRequestBody(item=uploadable_properties)
        print(f"Uploadable Properties: {uploadable_properties.additional_data}")
        # can be used for normal drive uploads
        try:
            upload_session = await graph_client.drives.by_drive_id(
                drive_id
            ).items.by_drive_item_id("root:/my_docs/test_upload.txt:"
                                     ).create_upload_session.post(upload_session_request_body)
            
        except APIError as ex:
            print(f"Error creating upload session: {ex}")

        # to be used for large file uploads
        large_file_upload_session = LargeFileUploadSession(
            upload_url=upload_session.upload_url,
            expiration_date_time=datetime.now() + timedelta(days=1),
            additional_data=upload_session.additional_data,
            is_cancelled=False,
            next_expected_ranges=upload_session.next_expected_ranges
        )

        max_chunk_size = 10 * 1024 * 1024
        task = LargeFileUploadTask(
            upload_session=large_file_upload_session, 
            request_adapter=graph_client.request_adapter, 
            stream=file, 
            parsable_factory=DriveItem, 
            max_chunk_size=max_chunk_size
        )
        total_length = os.path.getsize(file_path)
        
        # Upload the file
        # The callback
        def progress_callback(uploaded_byte_range: tuple[int, int]):
            print(f"Uploaded {uploaded_byte_range[0]} bytes of {total_length} bytes\n\n")

        try:
            upload_result = await task.upload(progress_callback)
            print(f"Upload complete {upload_result}")
        except APIError as ex:
            print(f"Error uploading: {ex.message} - {ex.response_status_code}")
            raise
    except APIError as e:
        print(f"Error: {e}")
        raise

asyncio.run(upload_large_file(graph_client, drive_id))

SDK Version

1.1.7

Latest version known to work for scenario above?

No response

Known Workarounds

Changing the max_chunk_size value to (file_size - 1) seems to prevent the error from occurring.

Debug output

Click to expand log ```
</details>


### Configuration

OS: Windows 10
Architecture: x64
Python version: 3.9.19

### Other information

_No response_
@itsmariodias itsmariodias added status:waiting-for-triage An issue that is yet to be reviewed or assigned type:bug A broken experience labels Nov 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status:waiting-for-triage An issue that is yet to be reviewed or assigned type:bug A broken experience
Projects
None yet
Development

No branches or pull requests

1 participant