Невозможно обновить файл на Google Диске с помощью возобновляемого подхода - PullRequest
1 голос
/ 09 апреля 2020

Я пытался узнать, как использовать Google Drive API для обновления файла на Google Диске с помощью возобновляемого сеанса.

Я получил «Запрещенный» ответ на загрузку запрос контента.

Не могли бы вы помочь мне найти пропущенные или неправильно используемые шаги?

  1. Пользователь авторизован с разрешениями:

  2. Выполнить запрос для создания возобновляемого сеанса:

    PATCH 'https://www.googleapis.com/upload/drive/v3/files/1XIU63B-U8b9Fe1_UFFVvd7OOdS_ANqAj?uploadType=resumable

  3. Получить URL сессии:

    https://www.googleapis.com/upload/drive/v3/files/1XIU63B-U8b9Fe1_UFFVvd7OOdS_ANqAj?uploadType=resumable&upload_id=AEnB2Uqew ...

  4. Отправить содержимое с помощью возобновляемого сеанса:

    PUT https://www.googleapis.com/upload/drive/v3/files/1XIU63B-U8b9Fe1_UFFVvd7OOdS_ANqAj?uploadType=resumable&upload_id=AEnB2Uqew ...

    Я не нашел ничего указанного c, связанного с этим шагом в документации, поэтому Я использую обычную документацию для загрузки https://developers.google.com/drive/api/v3/manage-uploads#upload -возобновляемую для обновления файла в «Несколько кусков»

  5. Я получаю 403 ошибку код состояния с ' Запрещенная причина и заголовок с upload_ id:

    Идентификатор загрузки X-GUploader: AEnB2Uqewr ...

1 Ответ

2 голосов
/ 10 апреля 2020
  • Вы хотите обновить существующий файл на Google Диске с помощью метода возобновляемой загрузки.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

К сожалению, из вашего вопроса я не смог понять тело запроса подробностей вашего теста. Этим я не могу повторить вашу ситуацию. Поэтому в этом ответе я хотел бы предложить пример потока для обновления существующего файла с помощью возобновляемой загрузки.

Пример ситуации:

В этом ответе в качестве примера ситуации предполагается, что текстовый файл на Google Диске обновляется путем повторной загрузки с несколькими кусками. И в качестве метода запроса я использую команду curl.

Я подготовил 2 файла для 2 блоков. В качестве тестовой ситуации загружены 2 блока по 262 144 байта и 37 856 байтов. Таким образом, общий размер загрузки составляет 300 000 байт.

При использовании возобновляемой загрузки соблюдайте следующие правила.

Добавьте данные чанка в тело запроса. Создайте фрагменты размером в 256 КБ (256 x 1024 байта), за исключением последнего фрагмента, который завершает загрузку. Сохраняйте размер куска как можно большим, чтобы загрузка была эффективной. Ссылка

Порядок обновления файла при возобновляемой загрузке:

1. Инициируйте возобновляемый сеанс загрузки

Создайте сеанс для загрузки с возобновляемой загрузкой. В этом случае существующий файл обновляется, поэтому конечной точкой является PUT https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable. Но как важный момент, пожалуйста, используйте метод PATCH вместо PUT. Когда используется PUT, location не включается в заголовок ответа. Я подумал, что официальный документ может быть неправильным.

$ curl -X PATCH -i \
  -H "Authorization: Bearer ###accessToken###" \
  "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable"

Если вы хотите обновить файл как многоэтапную загрузку, используйте следующую примерную команду. В этом случае имя файла изменяется.

$ curl -X PATCH -i \
  -H "Authorization: Bearer ###accessToken###" \
  -H "Content-Type: application/json; charset=UTF-8" \
  -d '{"name":"updatedFilename.txt"}' \
  "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable"

2. Загрузка 1-го блока

$ curl -X PUT -i \
  -H "Content-Length: 262144" \
  -H "Content-Range: bytes 0-262143/300000" \
  -H "Content-Type: text/plain" \
  -F "file=@data1.txt" \
  "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"
  • Когда эта команда curl запущена, возвращается 308 Resume Incomplete. Таким образом выясняется, что чанк может быть правильно загружен.

3. Загрузите 2-й блок (это последний блок в этом примере потока).

$ curl -X PUT -i \
  -H "Content-Length: 37856" \
  -H "Content-Range: bytes 262144-299999/300000" \
  -H "Content-Type: text/plain" \
  -F "file=@data2.txt" \
  "https://www.googleapis.com/upload/drive/v3/files/[FILE_ID]?uploadType=resumable&upload_id=###"
  • При выполнении этой команды curl возвращается 200 OK и метаданные файла также возвращаются. Таким образом, обнаруживается, что возобновляемая загрузка может быть выполнена правильно.

Примечание:

  • В этом случае файл обновляется как перезаписываемый. Поэтому, пожалуйста, будьте осторожны.
  • В моей среде, даже когда PUT изменен на PATCH для загрузки чанков, я могу подтвердить, что вышеуказанный поток работает.
    • Если в вашей среде возникает ошибка, попробуйте протестировать эту модификацию.
  • Пример вышеописанной ситуации, если вы хотите выгрузить один фрагмент размером 300 000 байт, пожалуйста, используйте -H "Content-Length: 300000" -H "Content-Range: bytes 0-299999/300000".

Ссылки:

Если я неправильно понял ваш вопрос и это было не то направление, которое вы хотите, я прошу прощения.

...