Загрузите и назовите файл, используя Google Drive REST API v3 и Angular 2

Я создаю сервис Google Drive с помощью Drive REST Api v3 в Angular 2. Большая часть функций имеется: просмотр файла, загрузка, создание и т. Д., Но я не могу найти, как назвать файл (также при создании файла или обновление).

Я использую следующие страницы документов: создавать и обновлять. Они говорят, что имя файла должно быть частью тела запроса. Соответствующий код из моего сервиса Google Drive ниже.

createFile(name :string, content :string) :Promise<Object> {
    let headers = new Headers({
      'Content-Type': 'text/markdown',
      'Authorization': 'Bearer ' + this.token,
      'name': name //TODO name not working!
    });
    let options = new RequestOptions({ headers: headers }); // Create a request option

    return this.http
      .post('https://www.googleapis.com/upload/drive/v3/files' + '?uploadType=multipart', content, options)
      .toPromise();
  }

updateFile(id :string, content :string, name :string) :Promise<Object> {
    let headers = new Headers({
      'Content-Type': 'text/markdown',
      'Authorization': 'Bearer ' + this.token,
      'id': id,
      'name': name //TODO name not working!
    }); //generate headers
    let options = new RequestOptions({ headers: headers }); // Create a request option

    return this.http
      .patch('https://www.googleapis.com/upload/drive/v3/files/' + id + '?uploadType=multipart', content, options)
      .toPromise();
  }

Подводя итог, файлы создаются и обновляются нормально (включая содержимое), но именование и переименование файла не работает вообще.

Спасибо за любую помощь.

3 ответа

Решение

Попробуйте разместить имя в теле запроса, а не в заголовке запроса, как описано в разделе Файлы: create:

Тело запроса

  • В теле запроса предоставьте ресурс Files со следующими свойствами в качестве метаданных. Для получения дополнительной информации см. Документ о загрузке медиа.

Чтобы проверить это, попробуйте использовать API Explorer, чтобы помочь вам в интерактивном режиме исследовать различные API Google.

Запрос образца:

POST https://www.googleapis.com/drive/v3/files?key={YOUR_API_KEY}

{
"name": "My File"
}

Отклик:

200

{

"kind": "drive#file",
"id": "fileID",
"name": "My File"
}

Также есть соответствующая публикация SO, в которой объясняется, как вставить файл в Google Drive через API.

Надеюсь это поможет.

Я тоже столкнулся с этой проблемой. Я думаю, что есть 3 решения:

  1. использование multipart upload https://developers.google.com/drive/v3/web/multipart-upload с различными заголовками для метаданных файла и фактического файла. Я сам застрял там, не нашел, как добавить границы для отдельных заголовков запросов в Angular 2+

  2. Загрузить файл в два запроса. Сначала создайте пустой файл с метаданными (в ответе будет указан идентификатор файла), а затем фактически обновите файл.

  3. использование resumable upload, Сначала запросите "настроить метаданные" (даже не будет создавать пустой файл) и получите "специальную ссылку", куда отправить запрос на загрузку актуального файла. И у этого подхода есть некоторые другие функции, такие как загрузка кусками. https://developers.google.com/drive/v3/web/resumable-upload

Вот ссылка на другой Вопрос с реализацией возобновляемой загрузки в Angular 2 и DRIVE REST API V3

Angular 2+ HTTP POST и GDrive API. Возобновляемая загрузка файла с именем

Я надеюсь, что это может быть полезно.

Вы пытаетесь установить имя, используя заголовок http. Это не верно. Я не могу понять, как вы думали, что это был способ сделать это, поэтому вам нужно вернуться и перечитать документацию Drive API.

Короче говоря, name: "name" должен быть объектом JSON, передаваемым в теле запроса, а не в заголовке http.

Другие вопросы по тегам