it-swarm.com.de

Wie füge ich über die API Dateien zu Google Drive hinzu / erstelle oder füge sie ein?

Benötigen Sie Hilfe beim Einfügen einer Datei in Google Drive über API. In der API-Dokumentation zu diesem Zweck wird nicht klar erläutert, wie der eigentliche Text der Datei über eine http-Post-Anfrage gesendet wird.

32
Niranja

Die Dokumentation zu Einfügevorgängen enthält bereits Beispiele in einer Reihe von Programmiersprachen. Hier erfahren Sie, wie Sie dies mit dem HTTP-basierten Protokoll der Google Drive-API tun.

Zuerst POST die neuen Dateimetadaten an den Drive-Endpunkt. Sie müssen in Form eines Dateiressourcen-JSON-Objekts vorliegen :

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"
}

Der Antworttext ist eine JSON-Darstellung der neu erstellten Dateiressource. Es wird so aussehen:

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

Dies ist eine Bestätigung, dass der Dateieintrag erstellt wurde. Nun müssen Sie den Inhalt hochladen. Dazu müssen Sie die ID der Datei verwenden, die in der obigen Antwort durch das id JSON-Attribut angegeben ist, und den Inhalt der tatsächlichen Datei mit einem OAuth 2.0 autorisierte Anfrage. Es sollte so aussehen:

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>

Du bist fertig :)

Es gibt auch eine Möglichkeit, dies in einer einzelnen POST) -Anforderung mit einer mehrteiligen Anforderung zu tun, bei der Sie die Metadaten der Datei gleichzeitig mit dem Inhalt bereitstellen. Hier ein Beispiel:

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--

Die Antwort enthält die Metadaten der neu erstellten Datei. Sie können auch den Header Content-Transfer-Encoding: base64 im Sub-Teil der Anfrage verwenden, um die Daten der Datei als übergeben zu können Base 64 codiert.

Schließlich gibt es noch ein resumable upload protocol , mit dem große Dateien hochgeladen, eine Pause-/Wiederaufnahmefunktion angeboten und/oder Dateien mit unterbrochener Internetverbindung hochgeladen werden können.

PS: Das meiste davon wird jetzt in Drive's Datei-Upload-Dokumentation beschrieben.

65
Nicolas Garnier

Danke für die Erklärung! Dies hat meine Stunden in Anspruch genommen, um mit der beschissenen Google SDK-Dokumentation im Kreis zu drehen (sorry, ich musste meine Scherze rausholen).

Hier ist eine Funktion, die ich gemacht habe, um eine Textdatei zu aktualisieren (wie Sie sehen können, aktualisiere ich 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,
    });
  }

Es ist ein Mashup des Google-Beispiels (das eine Binärdatei aus dem Upload verwendet) und der Nizza-Erklärung von @Nivco oben.

17
user1158023

4 Jahre später ist dies immer noch schwer herauszufinden. Ich habe die Antwort von @ user1158023 genommen, um das Hochladen von Bildern zu unterstützen. Ich benutze API v3 und superagent.js, um mir zu helfen (da gapi.client.request die Anfrage an content.googleapis.com sendet !?). Hoffentlich kann jemand dies nützlich finden.

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>
...
7
Munawwar

Ich wünschte, es gäbe bessere Beispiele für Laufwerk Gapis v3 ... Es dauerte einige Zeit, bis ich herausgefunden hatte, wie neue Inhalte in eine vorhandene Datei hochgeladen werden können, die mit erstellt wurde

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

aber irgendwann habe ich die "glückliche" Kombination aus dem Hinzufügen der fileId zum Pfad und dem Ändern der Methode in PATCH ausprobiert

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); }); 
}

Aber ich denke, dass jetzt die gesamte Dokumentation unter https://developers.google.com/drive/v3/reference/files/update für mich Sinn ergibt :-)

3
renato

Das Google Drive API Team Version hat Ende 2015 den Namen insert() in create() geändert um die Dateioperation besser widerzuspiegeln. Die Dokumentation wurde ebenfalls verbessert: Es gibt jetzt ein spezielles Handbuch für Uploads (einfach, mehrteilig und fortsetzbar), das mit Beispielcode in Java, Python, PHP, C # /. NET, Ruby, JavaScript geliefert wird /Node.js und iOS/Obj-C zum Hochladen einer regulären Datei und einer weiteren zum Importieren einer CSV-Datei als Google Sheet.

Nur um es übersichtlich darzustellen, gibt es unten eine alternative Python Lösung (zum Beispiel in den Dokumenten) für kurze Dateien ("einfacher Upload"), für die Sie die Klasse apiclient.http.MediaFileUpload nicht benötigen In diesem Snippet wird davon ausgegangen, dass Ihr Auth-Code dort funktioniert, wo sich Ihr Service-Endpunkt auf DRIVE mit einem minimalen Auth-Bereich von 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']))

Beachten Sie, dass es beim Schreiben einer Android App) ein separates Google Drive API für Android mit eigenen Dokumenten gibt. Wenn Sie schließlich JavaScript verwenden In Google Apps Script verwenden sowohl natives Drive Service-Objekt als auch erweiterter Drive Service immer noch Version 2 der API.

2
wescpy