web-dev-qa-db-fra.com

API Google Drive pour le téléchargement d'un fichier sur un lecteur d'équipe en Javascript

J'ai eu quelques problèmes avec l'API Google Drive et teamdrives. Pendant toute ma vie, je ne peux pas savoir comment télécharger un fichier sur le lecteur de l'équipe.

Je peux télécharger un fichier sur mon lecteur personnel en utilisant cette fonction:

 function insertFile(fileData, callback, desc) {
                const boundary = '-------314159265358979323846';
                const delimiter = "\r\n--" + boundary + "\r\n";
                const close_delim = "\r\n--" + boundary + "--";

                var reader = new FileReader();
                reader.readAsBinaryString(fileData);
                reader.onload = function(e) {
                    var contentType = fileData.type || 'application/octet-stream';
                    var metadata = {
                        'title': fileData.name,
                        'mimeType': contentType,
                        'description': desc,
                        "parents": [
                            {
                                "id": "1hBdtlAFrL2zljEcq2QVbqj14v_-SJarc"
                            }
                        ]

                    };

                    var base64Data = btoa(reader.result);
                    var multipartRequestBody =
                        delimiter +
                        'Content-Type: application/json\r\n\r\n' +
                        JSON.stringify(metadata) +
                        delimiter +
                        'Content-Type: ' + contentType + '\r\n' +
                        'Content-Transfer-Encoding: base64\r\n' +
                        '\r\n' +
                        base64Data +
                        close_delim;

                    var request = gapi.client.request({
                        'path': '/upload/drive/v2/files',
                        'method': 'POST',
                        'params': {'uploadType': 'multipart'},
                        'headers': {
                            'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
                        },
                        'body': multipartRequestBody


                    });
                    if (!callback) {
                        callback = function(file) {
                            console.log(file)
                        };
                    }
                    request.execute(callback);
                }
            }

Je ne sais pas comment adapter cela aux disques de groupe, j'ai été en mesure de visualiser des fichiers sur des disques de groupe. J'ai l'ID de lecteur de l'équipe, ainsi que l'ID de dossier dans lequel je souhaite insérer les fichiers.

Un exemple en javascript serait grandement apprécié, je n'arrive pas à en trouver un.

MODIFIER:

Je peux créer de nouveaux fichiers sur des lecteurs d'équipe en ajoutant le booléen teamdrivesupport. Je peux même créer de nouveaux fichiers. Cependant, je ne sais pas comment télécharger les données du fichier à l'aide de: 

 gapi.client.drive.files.create({
                'supportsTeamDrives':"true",
                'teamDriveId': 'TEAMDRIVEID',
                  "name" : 'test',
                  "mimeType" : "application/vnd.google-apps.folder",
                    'parents': ['FILEID']

}).then(function(response) {
               console.log(response)
            });

J'ai lu tous les documents et essayé d'innombrables façons, mais sans succès. Toute aide sera grandement appréciée.

7
user4778178

Après avoir essayé de nombreuses manières différentes, j’ai été incapable de trouver une solution directe à ce problème. Au lieu de cela, j'ai décidé d'utiliser mon lecteur personnel et de déplacer les fichiers sur le lecteur de mon équipe.

Il est possible de déplacer un fichier de votre lecteur personnel vers votre lecteur d'équipe, mais vous ne pouvez pas déplacer un dossier. Alors d’abord, j’ai créé les dossiers sur mon lecteur d’équipe avec le code suivant:

gapi.client.drive.files.create({
                'supportsTeamDrives':"true",
                'teamDriveId': 'teamID',
                  "name" : 'test',
                  "mimeType" : "application/vnd.google-apps.folder",
                    'parents': ['folderID']

}).then(function(response) {
               console.log(response)
            }

)

Cela créera un dossier vide sur votre lecteur d'équipe.

Ensuite, vous pouvez télécharger un fichier sur votre lecteur personnel en utilisant ceci:

function insertFile(fileData, callback, desc, folderID) {
                const boundary = '-------314159265358979323846';
                const delimiter = "\r\n--" + boundary + "\r\n";
                const close_delim = "\r\n--" + boundary + "--";

                var reader = new FileReader();
                reader.readAsBinaryString(fileData);
                reader.onload = function(e) {
                    var contentType = fileData.type || 'application/octet-stream';
                    var metadata = {
                        'title': fileData.name,
                        'mimeType': contentType,
                        'description': desc,
                        "parents": [
                            {
                                "id": folderID
                            }
                        ]

                    };

                    var base64Data = btoa(reader.result);
                    var multipartRequestBody =
                        delimiter +
                        'Content-Type: application/json\r\n\r\n' +
                        JSON.stringify(metadata) +
                        delimiter +
                        'Content-Type: ' + contentType + '\r\n' +
                        'Content-Transfer-Encoding: base64\r\n' +
                        '\r\n' +
                        base64Data +
                        close_delim;

                    var request = gapi.client.request({
                        'path': '/upload/drive/v2/files',
                        'method': 'POST',
                        'params': {'uploadType': 'multipart'},
                        'headers': {
                            'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
                        },
                        'body': multipartRequestBody

                    });
                    if (!callback) {
                        callback = function(file) {
                            console.log(file)
                        };
                    }
                    request.execute(callback);
                }
            }

Cela téléchargera le fichier sur votre lecteur personnel. Vous pourrez alors obtenir l'ID de fichier de la réponse et changer ses parents pour le transférer sur le lecteur de l'équipe:

gapi.client.drive.files.update({
      fileId: fileId,
        'supportsTeamDrives':"true",
                    'corpora':"teamDrive",
                    'teamDriveId': teamdriveID,
                     addParents: folderID,
                    removeParents: previousParents,
                    fields: 'id, parents'
    }).then(function(response) {           
                console.log(response.result.parents)                
            });

Ceci déplacera alors le fichier que vous avez téléchargé sur votre lecteur personnel, dans le dossier que vous avez créé sur votre lecteur d'équipe. 

Je sais que c'est une solution bâclée, mais je n'ai pas pu trouver d'autre travail à ce jour. 

J'espère que quelqu'un trouvera cela utile.

EDIT: La solution à cela, écrite en tant que fonctions asynchrones

      /* This function reads the filedata asynchronously for insert*/

        async function readFile(file){
                    let reader = new FileReader();
                    reader.readAsBinaryString(file);
                    return await new Promise(resolve => {
                        reader.onload = e => {
                            resolve(btoa(e.target.result));
                        };

                    });
                }

    /* This function inserts the file into the root of your personal drive, again this happens asynchronously */
    async function insertFile(fileData) {
                    try {
                        const boundary = '-------314159265358979323846';
                        const delimiter = "\r\n--" + boundary + "\r\n";
                        const close_delim = "\r\n--" + boundary + "--";

                        let base64Data = null;
                        await readFile(fileData).then(function(e) {
                            base64Data = e;
                        });

                        var contentType = fileData.type || 'application/octet-stream';
                        var metadata = {
                            'title': fileData.name,
                            'mimeType': contentType,                

                            "parents": [
                            {
                                "id": 'root'
                            }
                        ]

                        };

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

                        const fulfilledValue = await gapi.client.request({
                            'path': '/upload/drive/v2/files',
                            'method': 'POST',
                            'params': {'uploadType': 'multipart'},
                            'headers': {
                                'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
                            },
                            'body': multipartRequestBody

                        });
                        let result = await fulfilledValue.result;
                        return result;

                    }
                    catch (rejectedValue) {
                        console.log("Failed to insert file into folder", rejectedValue);
                    }
                }

/*This function ties everything together and moves the file to your team drive, and removes it from your personal drive, you need to provide the file data, team drive ID, and the ID of the folder on the team drive, again this is asynchronous*/

 async  function insertTeamDrive(file, teamdriveID, folderID) {
                try {

                    let id = null;
                    await insertFile(file).then(function(e) {               
                        id = e.id;
                    });

                    await gapi.client.drive.files.update({
                        fileId: id,
                        'supportsTeamDrives':"true",
                        'corpora':"teamDrive",
                        'teamDriveId': teamdriveID,
                        addParents: folderID,
                        removeParents: 'root',
                        fields: 'id, parents'
                    }).then(function(response) {           
                        console.log(response.result)                
                    });

                }
                catch (rejectedValue) {
                    console.log("Failed to insert into team drive", rejectedValue);
                }
            }

L'appel de insertTeamDrive téléchargera le fichier donné dans le dossier spécifié sur le lecteur d'équipe donné.

4
user4778178

Vous avez mis le supportsTeamDrives:"true" au mauvais endroit. 

the docs https://developers.google.com/drive/api/v2/reference/files/insert spécifie qu'il doit s'agir d'un paramètre de requête.

Donc, changez simplement vos paramètres de requête de requête en ceci: 

'params': {'uploadType': 'multipart', supportsTeamDrives: 'true' }

Donc, toute la demande devient:

var request = gapi.client.request({
  'path': '/upload/drive/v2/files',
  'method': 'POST',
  'params': {'uploadType': 'multipart', 'supportsTeamDrives': 'true' },
  'headers': {
    'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
  },
  'body': multipartRequestBody
});
2
willwoo

Essayez celui-ci à partir de Google uploads
Lisez aussi ceci: Simple upload

var fileMetadata = {
      'name': 'photo.jpg'
    };
    var media = {
      mimeType: 'image/jpeg',
      body: fs.createReadStream('files/photo.jpg')
    };
    drive.files.create({
      resource: fileMetadata,
      media: media,
      fields: 'id'
    }, function (err, file) {
      if (err) {
        // Handle error
        console.error(err);
      } else {
        console.log('File Id: ', file.id);
      }
    });

1
nick318

Vous pouvez vous référer à la documentation pour savoir comment vous pouvez utiliser le sélecteur de fichiers avec des lecteurs d'équipe .

Il existe un exemple disponible, celui-ci est un sélecteur d’image ou une page de téléchargement.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title>Google Picker Example</title>

    <script type="text/javascript">

    // The Browser API key obtained from the Google API Console.
    // Replace with your own Browser API key, or your own key.
    var developerKey = 'xxxxxxxYYYYYYYY-12345678';

    // The Client ID obtained from the Google API Console. Replace with your own Client ID.
    var clientId = "1234567890-abcdefghijklmnopqrstuvwxyz.apps.googleusercontent.com"

    // Replace with your own project number from console.developers.google.com.
    // See "Project number" under "IAM & Admin" > "Settings"
    var appId = "1234567890";

    // Scope to use to access user's Drive items.
    var scope = ['https://www.googleapis.com/auth/drive'];

    var pickerApiLoaded = false;
    var oauthToken;

    // Use the Google API Loader script to load the google.picker script.
    function loadPicker() {
      gapi.load('auth', {'callback': onAuthApiLoad});
      gapi.load('picker', {'callback': onPickerApiLoad});
    }

    function onAuthApiLoad() {
      window.gapi.auth.authorize(
          {
            'client_id': clientId,
            'scope': scope,
            'immediate': false
          },
          handleAuthResult);
    }

    function onPickerApiLoad() {
      pickerApiLoaded = true;
      createPicker();
    }

    function handleAuthResult(authResult) {
      if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        createPicker();
      }
    }

    // Create and render a Picker object for searching images.
    function createPicker() {
      if (pickerApiLoaded && oauthToken) {
        var view = new google.picker.View(google.picker.ViewId.DOCS);
        view.setMimeTypes("image/png,image/jpeg,image/jpg");
        var picker = new google.picker.PickerBuilder()
            .enableFeature(google.picker.Feature.NAV_HIDDEN)
            .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
            .setAppId(appId)
            .setOAuthToken(oauthToken)
            .addView(view)
            .addView(new google.picker.DocsUploadView())
            .setDeveloperKey(developerKey)
            .setCallback(pickerCallback)
            .build();
         picker.setVisible(true);
      }
    }

    // A simple callback implementation.
    function pickerCallback(data) {
      if (data.action == google.picker.Action.PICKED) {
        var fileId = data.docs[0].id;
        alert('The user selected: ' + fileId);
      }
    }
    </script>
  </head>
  <body>
    <div id="result"></div>

    <!-- The Google API Loader script. -->
    <script type="text/javascript" src="https://apis.google.com/js/api.js?onload=loadPicker"></script>
  </body>
</html>
1