microsoftgraph / microsoftgraph/msgraph-sdk-python-core

LargeFileUploadTask fails: AttributeError: 'NoneType' object has no attribute 'create_from_discriminator_value'

未关闭
#716 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

area:uploads P1 priority:p1 type:bug
主要语言
Python
星标
288
派生
52
平均合并
8 小时 10 分钟
30 天内合并 PR
1

描述

Describe the bug

I am using LargeFileUploadTask to upload files to a sharepoint directory using the following code.
The file is uploaded in visible in the sharepoint, but the code returns an error.
Code:

from azure.identity.aio import ClientSecretCredential # async credentials only
from kiota_authentication_azure.azure_identity_authentication_provider import AzureIdentityAuthenticationProvider
import os
from msgraph import GraphServiceClient
from msgraph_core.tasks.large_file_upload import LargeFileUploadTask, LargeFileUploadSession
import asyncio
from msgraph.generated.drives.item.items.item.create_upload_session.create_upload_session_post_request_body import CreateUploadSessionPostRequestBody
from msgraph.generated.models.drive_item_uploadable_properties import DriveItemUploadableProperties
from datetime import datetime, timedelta, timezone
from kiota_abstractions.api_error import APIError

# Replace these with your app and tenant information
client_id = ''
client_secret = ''
tenant_id = ''
site_id = ''
drive_id = ''
folder_path = ''  # Local path of the file to upload
file_name = ''

scopes = ['https://graph.microsoft.com/.default']
credential = ClientSecretCredential(
    tenant_id,
    client_id,
    client_secret)
# Initialize the Graph client
graph_client = GraphServiceClient(credential, scopes)

async def upload_large_file_to_sharepoint(graph_client, site_id, drive_id, folder_path, file_path, file_name):
    try:
        # Create the upload session URL path
        file = open(f"{folder_path}/{file_name}",'rb')
        uploadable_properties = DriveItemUploadableProperties(
            additional_data={'@microsoft.graph.conflictBehavior': 'replace'}
        )
        upload_session_request_body = CreateUploadSessionPostRequestBody(
            item=uploadable_properties)
        try:
            upload_session = await graph_client.drives.by_drive_id(drive_id).items.by_drive_item_id('root:/export/out_seasons2.csv:').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(timezone.utc) + timedelta(days=1),
            additional_data=upload_session.additional_data,
            is_cancelled=False,
            next_expected_ranges=upload_session.next_expected_ranges
        )

        task = LargeFileUploadTask(
             large_file_upload_session,
             graph_client.request_adapter,
             file)
        total_length = os.path.getsize(f"{folder_path}/{file_name}")

        # Upload the file
        # The callback
        def progress_callback(uploaded_byte_range: tuple[int, int]):
            print(f"Uploaded {int(uploaded_byte_range[0])/1024/1024:.2f} MegaBytes of {int(total_length)/1024/1024:.2f} MegaBytes\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}")
    except APIError as e:
        print(f"Error: {e}")
# Run the async upload function
asyncio.run(upload_large_file_to_sharepoint(graph_client, site_id, drive_id, folder_path, folder_path, file_name))

Error:

Traceback (most recent call last):
  File "/Users/timwiethoff/Documents/dev/spielwiese_python/sharepoint-func copy.py", line 72, in <module>
    asyncio.run(upload_large_file_to_sharepoint(graph_client, site_id, drive_id, folder_path, folder_path, file_name))
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/asyncio/runners.py", line 194, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/Users/timwiethoff/Documents/dev/spielwiese_python/sharepoint-func copy.py", line 65, in upload_large_file_to_sharepoint
    upload_result = await task.upload(progress_callback)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/site-packages/msgraph_core/tasks/large_file_upload.py", line 110, in upload
    response = await self.last_chunk(self.stream)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/site-packages/msgraph_core/tasks/large_file_upload.py", line 220, in last_chunk
    return await self.request_adapter.send_async(info, parsable_factory, error_map)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/site-packages/kiota_http/httpx_request_adapter.py", line 190, in send_async
    value = root_node.get_object_value(parsable_factory)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/anaconda3/envs/spielwiese/lib/python3.12/site-packages/kiota_serialization_json/json_parse_node.py", line 219, in get_object_value
    result = factory.create_from_discriminator_value(self)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'create_from_discriminator_value'
Expected behavior

Dont generate an error, because the file is uploaded successfully.

How to reproduce

Use my code snippet and upload a file larger than 5 mb.

SDK Version

1.1.6

Latest version known to work for scenario above?

No response

Known Workarounds

No response

Debug output
Click to expand log ```
</details>


### Configuration

OS: MacOS Sequoia 15.0.1
ARM

### Other information

_No response_

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 msgraph_core/tasks/large_file_upload.py 开始,尤其关注 last_chunk,并按照 traceback 中显示的 request adapter 响应解析过程进行跟踪。使用提供的代码和一个大于 5 MB 的文件重现该问题;当上传在没有 NoneType 解析错误的情况下完成并返回其结果时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
api
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。