Comment ajouter/créer / insérer des fichiers à GoogleDrive via L'API?

besoin d'aide concernant l'insertion d'un fichier à Google drive par api. La documentation de l'api à cet effet n'explique pas clairement comment envoyer le corps du fichier via la requête http post.

31
demandé sur wescpy 2012-04-25 18:19:08

5 réponses

la documentation sur les opérations d'insertion contient déjà des exemples dans un tas de langages de programmation, voici comment le faire en utilisant le protocole HTTP basé sur L'API Google Drive.

tout d'abord, postez les nouvelles métadonnées du fichier sur le point final du lecteur. Il doit être sous la forme d'un fichier de ressource JSON objet :

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

le corps de réponse sera une représentation JSON de la nouvelle Fichier de ressources. Il ressemblera à:

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

ceci est une confirmation que l'entrée de fichier a été créée. Maintenant, vous devez télécharger le contenu. Pour ce faire, vous devez prendre L'ID du fichier donné par l'attribut id JSON dans la réponse ci-dessus et mettre le contenu du fichier réel au point final de téléchargement avec une demande autorisée OAuth 2.0. Il devrait ressembler à:

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>

Vous faite :)

il y a aussi un moyen de le faire en une seule requête poste en utilisant une requête multipart où vous postez les métadonnées du fichier en même temps que le contenu. Voici un exemple:

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

La réponse contient les métadonnées du fichier nouvellement créé. Vous pouvez également utiliser l'en-tête Content-Transfer-Encoding: base64 dans la sous-partie de la requête pour pouvoir transmettre les données du fichier en tant que Base 64 encodée.

enfin il y a aussi un protocole de téléchargement réutilisable qui est pratique pour télécharger de gros fichiers, offrir une pause/fonction de reprise et/ou télécharger des fichiers avec une connexion Internet flaky.

PS: la plupart de cela est maintenant décrit dans la documentation de téléchargement de fichier de disque .

61
répondu Nicolas Garnier 2012-09-24 07:58:35

Merci pour l'explication! Cela m'a pris des heures à tourner en rond avec la documentation merdique de google SDK (désolé, j'ai dû sortir mon délire).

Voici une fonction que j'ai créée qui va mettre à jour un fichier texte (comme vous pouvez le voir je mets à jour 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,
    });
  }

c'est un mashup de l'exemple de google (qui utilise un fichier binaire à partir du téléchargement), et la belle explication de @Nivco ci-dessus.

17
répondu user1158023 2012-12-21 07:21:11

4 ans plus tard, c'est encore difficile à comprendre. J'ai pris la réponse de @user1158023 pour supporter le téléchargement d'images. J'utilise API v3 et superagent.js pour m'aider (depuis gapi.client.demande est d'envoyer la demande à content.googleapis.com!?). J'espère que quelqu'un trouvera ça utile.

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

de l'index.html

...
<form>
    <span>Upload: </span><input id="file" type="file" name="myFile">
</form>
...
7
répondu Munawwar 2016-01-11 21:42:31

je souhaite il y avait de meilleurs exemples pour le lecteur gapis v3... Il m'a fallu un certain temps pour comprendre comment pour télécharger le nouveau contenu dans un fichier créé avec

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

mais finalement j'ai essayé la combinaison "lucky" d'ajouter le fileId au chemin et de changer la méthode en 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); }); 
}

mais je suppose que maintenant toute la documentation à https://developers.google.com/drive/v3/reference/files/update commence à avoir du sens pour moi: -)

3
répondu renato 2016-05-02 20:16:24

Le Google Drive " API équipe publié v3 à la fin de 2015, et dans cette version, insert() a changé de nom pour create() , afin de mieux refléter l'opération de fichier. La documentation a également été améliorée: il y a maintenant un guide spécial consacré aux téléchargements (simple, multipart, et resumable) qui est livré avec du code échantillon en Java, Python, PHP, C#/.NET, Ruby, JavaScript/Node.js, et iOS/Obj-C pour le téléchargement un fichier régulier et un autre pour importer un fichier CSV sous forme de feuille Google.

juste pour se montrer simple, il est, ci-dessous est un alternative solution Python (à l'échantillon dans les docs) pour les fichiers courts ("simple upload") où vous n'avez pas besoin de la classe apiclient.http.MediaFileUpload . Cet extrait suppose que votre code d'auth fonctionne lorsque votre endpoint de service est DRIVE avec un champ d'auth minimum de 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']))

Note que si vous écrivez une application Android, il ya une API Google Drive pour Android avec son propre ensemble de docs. Enfin, si vous utilisez JavaScript sur Google Apps Script, les deux Drive Service native object et Drive Advanced Service utilisent toujours v2 de l'API.

2
répondu wescpy 2017-03-16 16:21:07