Подтвердить что ты не робот

Как добавить/создать/вставить файлы на Google Диск через API?

Нужна помощь относительно вставки файла на Google Drive через api. Документация api для этой цели не дает четкого объяснения того, как отправить фактический текст файла через HTTP-запрос.

4b9b3361

Ответ 1

Документация для операций вставки уже содержит примеры из нескольких языков программирования, вот как это сделать, используя протокол HTTP API Google Диска.

Сначала отправьте POST новые метаданные файла в конечную точку Диска. Он должен быть в виде файла JSON объекта ресурса:

POST /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
...

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}

Тело ответа будет представлением JSON только что созданного Файлового ресурса. Он будет выглядеть так:

{
  "kind": "drive#file",
  "id": string,
  "etag": etag,
  "selfLink": string,
  "title": "file_name",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
  ...
  "downloadUrl": string,
  ...
}

Это подтверждение того, что запись файла была создана. Теперь вам нужно загрузить контент. Для этого вам нужно взять идентификатор файла, заданный атрибутом id JSON, в ответе выше и PUT содержимое фактического файла в конечную точку загрузки с авторизованным запросом OAuth 2.0. Он должен выглядеть так:

PUT /upload/drive/v2/files/{id}?uploadType=media HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: mime/type

<file content here>

Вы закончили:)

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

POST /upload/drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer <OAuth 2.0 access token here>
Content-Type: multipart/form-data; boundary=287032381131322
...

--287032381131322
Content-Type: application/json

{
  "title": "file_name.extension",
  "mimeType": "mime/type",
  "description": "Stuff about the file"
}
--287032381131322
Content-Type: mime/type

<file content here>
--287032381131322--

Ответ будет содержать метаданные вновь созданного файла. Вы также можете использовать заголовок Content-Transfer-Encoding: base64 в подчасти части запроса, чтобы иметь возможность передавать данные файла в кодировке Base 64.

Наконец, существует также возобновляемый протокол загрузки, который удобно загружать большие файлы, предлагает функцию паузы/возобновления и/или загружать файлы с закрытым подключением к Интернету.

PS: большинство из них теперь описано в документации по загрузке файлов на диске.

Ответ 2

Спасибо за объяснение! Это заняло мои часы в кругах с дерьмовой документацией по Google SDK (извините, что я должен был получить мой пирс).

Здесь была создана функция, которая будет обновлять текстовый файл (как вы можете видеть, я обновляю html):

  function gd_updateFile(fileId, folderId, text, callback) {

    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    var contentType = "text/html";
    var metadata = {'mimeType': contentType,};

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter + 'Content-Type: ' + contentType + '\r\n' + '\r\n' +
        text +
        close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ",file) }; }

    gapi.client.request({
        'path': '/upload/drive/v2/files/'+folderId+"?fileId="+fileId+"&uploadType=multipart",
        'method': 'PUT',
        'params': {'fileId': fileId, 'uploadType': 'multipart'},
        'headers': {'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'},
        'body': multipartRequestBody,
        callback:callback,
    });
  }

Это mashup из примера Google (который использует двоичный файл из загрузки) и приятное объяснение от @Nivco выше.

Ответ 3

Через 4 года это все еще трудно понять. Я принял @user1158023 ответ для поддержки загрузки изображений. Я использую API v3 и superagent.js, чтобы помочь мне (поскольку gapi.client.request отправляет запрос на content.googleapis.com!?). Надеюсь, кто-то может найти это полезным.

function gd_uploadFile(name, contentType, data, callback) {
    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    contentType = contentType || "text/html";
    var metadata = {
        name: name,
        'mimeType': contentType
    };

    var multipartRequestBody =
        delimiter +  'Content-Type: application/json\r\n\r\n' +
        JSON.stringify(metadata) +
        delimiter +
        'Content-Type: ' + contentType + '\r\n';

    //Transfer images as base64 string.
    if (contentType.indexOf('image/') === 0) {
        var pos = data.indexOf('base64,');
        multipartRequestBody += 'Content-Transfer-Encoding: base64\r\n' + '\r\n' +
            data.slice(pos < 0 ? 0 : (pos + 'base64,'.length));
    } else {
        multipartRequestBody +=  + '\r\n' + data;
    }
    multipartRequestBody += close_delim;

    if (!callback) { callback = function(file) { console.log("Update Complete ", file) }; }

    superagent.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart').
        set('Content-Type', 'multipart/form-data;  boundary="' + boundary + '"').
        set('Authorization', 'Bearer ' + gapi.auth.getToken().access_token).
        send(multipartRequestBody).
        end(function () {
            console.log(arguments);
        });
}

//On upload
$('#file')[0].onchange = function () {
    var file = $('#file')[0].files[0];
    if (file && file.type === 'image/jpeg') {
        var reader = new FileReader();
        reader.onloadend = function () {
            var data = reader.result;
            gd_uploadFile('img.jpg', 'image/jpeg', data, function () {
                console.log(arguments);
            });
        }
        reader.readAsDataURL(file);
    }
};

index.html

...
<form>
    <span>Upload: </span><input id="file" type="file" name="myFile">
</form>
...

Ответ 4

У меня были лучшие примеры для диска gapis v3... Мне потребовалось некоторое время, чтобы выяснить, как загрузить новый контент в существующий файл, созданный с помощью

gapi.client.drive.files.create({ "name" : "savefile.txt" }).execute(function(file) { console.log("Created file " + file.name + " id: " + file.id); });

но в итоге я попробовал "удачную" комбинацию добавления fileId к пути и изменения метода на PATCH

function uploadFile(id, text)                                                                                                                                                          
{
  var auth_token = gapi.auth.getToken().access_token;

  const boundary = '-------314159265358979323846';
  const delimiter = "\r\n--" + boundary + "\r\n";
  const close_delim = "\r\n--" + boundary + "--";

  var metadata = { 
      description : 'savefile for my game',
      'mimeType': 'application/json'
  };  

  var multipartRequestBody =
    delimiter +  'Content-Type: application/json\r\n\r\n' +
    JSON.stringify(metadata) +
    delimiter + 'Content-Type: application/json\r\n\r\n' +
    text +
    close_delim;

  gapi.client.request
    ( { 
     'path': '/upload/drive/v3/files/'+id,
     'method': 'PATCH',
     'params': {'fileId': id, 'uploadType': 'multipart'},
     'headers': { 'Content-Type': 'multipart/form-data; boundary="' + boundary + '"', 'Authorization': 'Bearer ' + auth_token, },
     'body': multipartRequestBody 
     }).execute(function(file) { console.log("Wrote to file " + file.name + " id: " + file.id); }); 
}

Но я предполагаю, что теперь вся документация в https://developers.google.com/drive/v3/reference/files/update начинает меня понимать: -)

Ответ 5

API Google Диска команда выпущена v3 в конце 2015 года и в этом выпуске insert() изменили имена на create(), чтобы лучше отразить операцию файла. Документация также была улучшена: теперь существует специальное руководство, посвященное загрузкам (простое, многостраничное и возобновляемое), которое поставляется с образцом кода в Java, Python, PHP, С#/. NET, Ruby, JavaScript/ Node.js и iOS/Obj-C для загрузки обычного файла, а другой для импорта CSV файла в качестве Листа Google.

Просто для того, чтобы прямо показать это, ниже представлено одно альтернативное решение Python (к образцу в документах) для коротких файлов ( "простая загрузка" ), где вам не нужен класс apiclient.http.MediaFileUpload. Этот фрагмент предполагает, что ваш auth-код работает там, где конечная точка службы DRIVE с минимальным объемом полномочий https://www.googleapis.com/auth/drive.file.

# filenames & MIMEtypes
DST_FILENAME = 'inventory'
SRC_FILENAME = DST_FILENAME + '.csv'
SHT_MIMETYPE = 'application/vnd.google-apps.spreadsheet'
CSV_MIMETYPE = 'text/csv'

# Import CSV file to Google Drive as a Google Sheets file
METADATA = {'name': DST_FILENAME, 'mimeType': SHT_MIMETYPE}
rsp = DRIVE.files().create(body=METADATA, media_body=SRC_FILENAME).execute()
if rsp:
    print('Imported %r to %r (as %s)' % (SRC_FILENAME, DST_FILENAME, rsp['mimeType']))

Обратите внимание, что если вы пишете приложение для Android, есть отдельный API Google Диска для Android с собственным набором документов. Наконец, если вы используете JavaScript в Google Apps Script, родной объект службы диска и "Расширенная служба" по-прежнему используют v2 API.