microsoftgraph / microsoftgraph/msgraph-sdk-python-core

`LargeFileUploadTask` fails when uploading an attachment to an Outlook item

Abierto
#691 3 comentarios 0 reacciones 1 asignado Ver en GitHub

@shemogumbe ya está trabajando en esto.

Desde el 14/10/2024.

type:bug
Lenguaje dominante
Python
Estrellas
288
Forks
52
Merge medio
8 h 10 min
PR fusionados (30 d)
1

Descripción

async def upload_attachment_to_message(graph_client: GraphServiceClient, file_path: str) -> None:
    # <UploadAttachmentSnippet>
    # Create message
    draft_message = Message(
        subject="Large attachment"
    )

    saved_draft = await graph_client.me.messages.post(draft_message)
    if saved_draft is None or saved_draft.id is None: return

    file_stream = open(file_path, 'rb')
    total_length = os.path.getsize(file_path)

    large_attachment = AttachmentItem(
        attachment_type=AttachmentType.File,
        name=os.path.basename(file_path),
        size=total_length
    )

    # import msgraph.generated.users.item.messages.item.attachments.create_upload_session.create_upload_session_post_request_body as attachment_upload
    upload_session_body = attachment_upload.CreateUploadSessionPostRequestBody(
        attachment_item=large_attachment
    )

    upload_session = await graph_client.me.messages.by_message_id(
        saved_draft.id).attachments.create_upload_session.post(upload_session_body)

    if upload_session is None: return

    # Max slice size must be a multiple of 320 KiB
    max_slice_size = 320 * 1024
    file_upload_task = LargeFileUploadTask(
        upload_session=upload_session,
        request_adapter=graph_client.request_adapter,
        stream=file_stream, # type: ignore
        max_chunk_size=max_slice_size,
        parsable_factory=FileAttachment #type:ignore
    )

    # Create a callback that is invoked after each slice is uploaded
    def progress_callback(uploaded_byte_range: tuple[int,int]):
        print(f'Uploaded {uploaded_byte_range[0]} bytes of {total_length} bytes\n')

    try:
        upload_result = await file_upload_task.upload(progress_callback)
        if upload_result.upload_succeeded and upload_result.item_response is not None:
            file_attachment: FileAttachment = upload_result.item_response
            print(f'Upload complete, attachment ID: {file_attachment.id}')
        else:
            print('Upload failed')
    except APIError as ex:
        print(f'Error uploading attachment: {ex.message}')

On the line upload_result = await file_upload_task.upload(progress_callback) an exception is thrown.

Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/adapter/../../debugpy/launcher/../../debugpy/__main__.py", line 71, in <module>
    cli.main()
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/adapter/../../debugpy/launcher/../../debugpy/../debugpy/server/cli.py", line 486, in main
    run()
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/adapter/../../debugpy/launcher/../../debugpy/../debugpy/server/cli.py", line 336, in run_file
    runpy.run_path(target, run_name="__main__")
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 321, in run_path
    return _run_module_code(code, init_globals, run_name,
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 135, in _run_module_code
    _run_code(code, mod_globals, init_globals,
  File "/home/jasonjoh/.vscode-server-insiders/extensions/ms-python.debugpy-2024.11.2024082901-linux-x64/bundled/libs/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_runpy.py", line 124, in _run_code
    exec(code, run_globals)
  File "/home/jasonjoh/repos/msgraph-snippets-python/src/main.py", line 54, in <module>
    asyncio.run(main())
  File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
    return future.result()
  File "/home/jasonjoh/repos/msgraph-snippets-python/src/main.py", line 45, in main
    await LargeFileUpload.run_all_samples(user_client, large_file_settings['largeFilePath'])
  File "/home/jasonjoh/repos/msgraph-snippets-python/src/snippets/large_file_upload.py", line 22, in run_all_samples
    await LargeFileUpload.upload_attachment_to_message(graph_client, file_path)
  File "/home/jasonjoh/repos/msgraph-snippets-python/src/snippets/large_file_upload.py", line 128, in upload_attachment_to_message
    upload_result = await file_upload_task.upload(progress_callback)
  File "/home/jasonjoh/.local/lib/python3.10/site-packages/msgraph_core/tasks/large_file_upload.py", line 95, in upload
    session = await self.next_chunk(
  File "/home/jasonjoh/.local/lib/python3.10/site-packages/msgraph_core/tasks/large_file_upload.py", line 179, in next_chunk
    return await self.request_adapter.send_async(info, parsable_factory, error_map)
  File "/home/jasonjoh/.local/lib/python3.10/site-packages/kiota_http/httpx_request_adapter.py", line 176, in send_async
    response = await self.get_http_response_message(request_info, parent_span)
  File "/home/jasonjoh/.local/lib/python3.10/site-packages/kiota_http/httpx_request_adapter.py", line 542, in get_http_response_message
    return await self.retry_cae_response_if_required(resp, request_info, claims)
  File "/home/jasonjoh/.local/lib/python3.10/site-packages/kiota_http/httpx_request_adapter.py", line 559, in retry_cae_response_if_required
    raise ValueError("Unable to parse claims from response")
ValueError: Unable to parse claims from response

My suspicion is that this is similar to the problem the Go SDK had in its initial implementation: it's sending an Authorization header with each upload request: https://github.com/microsoftgraph/msgraph-sdk-go-core/issues/320

I can't confirm that this is the case, but it seems likely.

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.