Importer l'image de l'URL vers Google Drive via l'API Google Drive Javascript

Aug 18 2020

Je suis nouveau en Javascript et désolé si ma question vous semble boiteuse. Je souhaite télécharger une image de mon site Web vers mon Google Drive. J'ai implémenté avec succès la partie Authentification et création de dossier, mais je suis confus au sujet du processus de téléchargement.
Dites ceci est mon code pour créer un dossier dans Google Drive:

function createFolder(folderName) {
  var parentId = 'xxxxxxx';//some parentId of a folder under which to create the new folder
  var fileMetadata = {
    'name' : folderName,
    'mimeType' : 'application/vnd.google-apps.folder',
    'parents': [parentId]
  };
  gapi.client.drive.files.create({
    resource: fileMetadata,
  }).then(function(response) {
    switch(response.status){
      case 200:
      var file = response.result;
      console.log('Created Folder Id: ', file.id);
      uploadImage(file.id);
      break;
      default:
      console.log('Error creating the folder, '+response);
      break;
    }
  });
}

Maintenant, je veux télécharger mon image à partir de cette URL: https://xxxxxx.comdans le dossier nouvellement créé à partir de la réponse supérieure ( file.id)

C'est ce que j'ai dans la documentation de l'API Google, mais où dois-je y mettre / joindre mon URL?

function uploadImage(folderId) {
  var fileMetadata = {
    'name': 'photo.jpg',
    parents: [folderId]
  };
  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);
    }
  });
}   

Merci beaucoup d'avance.

Réponses

1 Tanaike Aug 19 2020 at 08:26

Je crois que votre objectif est le suivant.

  • Vous souhaitez télécharger un fichier à partir d'une URL et télécharger le fichier téléchargé sur Google Drive à l'aide de Javascript.
  • Dans votre cas, votre gapi.clientpeut être utilisé pour télécharger le fichier sur Google Drive.

Points de modification:

  • Dans la phase actuelle, malheureusement, il semble que gapi.client.drive.files.createne peut toujours pas envoyer la demande, y compris le contenu. Ref Donc, dans ce cas, je voudrais proposer de l'utiliser fetchcomme solution de contournement. Quand fetchest utilisé, le contenu du fichier et les métadonnées peuvent être demandés avec multipart/form-data.
  • Dans cette solution de contournement, le jeton d'accès est utilisé à partir de gapi.client. Donc, ce script suppose que vous gapi.clientpouvez être utilisé pour télécharger le fichier. Veuillez faire attention à cela.

Script modifié:

const url = "###";  // Please set the URL.
const fileName = "sample filename";
const folderId = "###";  // Please set the folder ID.

fetch(url).then(res => res.blob()).then(blob => {
  const form = new FormData();
  form.append('metadata', new Blob([JSON.stringify({name: fileName, parents: [folderId]})], {type: 'application/json'}));
  form.append('file', blob);
  fetch('https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', {
    method: 'POST',
    headers: new Headers({'Authorization': 'Bearer ' + gapi.auth.getToken().access_token}),
    body: form
  }).then(res => res.json()).then(val => console.log(val));
});
  • Lorsque vous exécutez ce script, le résultat suivant est visible sur la console. (Lorsque l'URL est le lien direct du fichier image Jpeg.)

      {
        "kind": "drive#file",
        "id": "###",
        "name": "sample filename",
        "mimeType": "image/jpeg"
      }
    

Remarque:

  • Dans ce cas, uploadType=multipartest utilisé. La taille maximale du fichier est donc de 5 Mo. Veuillez faire attention à cela. Lorsque vous souhaitez utiliser plus de 5 Mo, veuillez cocher Téléchargement avec reprise. Réf

Références:

  • Utiliser Fetch
  • Télécharger des données de fichier

Ajoutée:

Afin d'éviter l'erreur liée à CORS, comme une autre méthode, je voudrais proposer d'utiliser les Web Apps comme wrapper. Dans ce cas, le côté client est Javascript. Ce Javascript peut être utilisé à l'extérieur de Google.

Usage:

Veuillez suivre la procédure suivante.

1. Créez un nouveau projet de Google Apps Script.

Un exemple de script de Web Apps est un script Google Apps. Veuillez donc créer un projet de Google Apps Script.

Si vous souhaitez le créer directement, veuillez accéder à https://script.new/. Dans ce cas, si vous n'êtes pas connecté à Google, l'écran de connexion s'ouvre. Veuillez donc vous connecter à Google. Par cela, l'éditeur de script de Google Apps Script est ouvert.

2. Préparez le script.

Veuillez copier et coller le script suivant (Google Apps Script) dans l'éditeur de script. Ce script est destiné aux applications Web.

Côté serveur: Google Apps Script

Ce script est utilisé pour les applications Web. Dans ce cas, les applications Web sont utilisées comme wrapper.

function doGet(e) {
  const imageUrl = e.parameter.imageUrl;
  const res = UrlFetchApp.fetch(imageUrl);
  if (res.getResponseCode() != 200) throw new Error("Image couldn't be retrieved.");
  const blob = res.getBlob();
  const file = DriveApp.getFolderById(e.parameter.folderId).createFile(blob.setName(e.parameter.filename));
  const obj = {id: file.getId(), name: file.getName(), mimeType: file.getMimeType()};
  return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
}

3. Déployez des applications Web.

  1. Dans l'éditeur de script, ouvrez une boîte de dialogue par "Publier" -> "Déployer en tant qu'application web".
  2. Sélectionnez «Moi» pour «Exécuter l'application en tant que:» .
    • Par cela, le script est exécuté en tant que propriétaire.
  3. Sélectionnez "Tout le monde, même anonyme" pour "Qui a accès à l'application:" .
  4. Cliquez sur le bouton «Déployer» comme nouvelle «version du projet».
  5. Ouvre automatiquement une boîte de dialogue de "Autorisation requise".
    1. Cliquez sur "Examiner les autorisations".
    2. Sélectionnez votre propre compte.
    3. Cliquez sur "Avancé" dans "Cette application n'est pas vérifiée".
    4. Cliquez sur "Aller au ### nom du projet ### (unsafe)"
    5. Cliquez sur le bouton "Autoriser".
  6. Cliquez sur OK".
  7. Copiez l'URL des applications Web. C'est comme https://script.google.com/macros/s/###/exec.
    • Lorsque vous avez modifié le script Google Apps, veuillez le redéployer en tant que nouvelle version. Ainsi, le script modifié est reflété dans les applications Web. Veuillez faire attention à cela.

4. Téléchargez un fichier du côté client vers le côté serveur.

Côté client: HTML et Javascript

Veuillez définir l'URL de vos applications Web sur le script suivant. Et, veuillez définir le nom de fichier et l'ID de dossier.

const imageUrl = "###"; // Please set the URL of image.

const url = "https://script.google.com/macros/s/###/exec"; // Please set the URL of Web Apps.
const qs = new URLSearchParams({
  imageUrl: imageUrl,
  filename: "sample filename",
  folderId: "###", // Please set folder ID.
});
fetch(`${url}?${qs}`).then((res) => res.json()).then(console.log).catch(console.log);
Résultat:

Lorsque le script ci-dessus est exécuté, la valeur suivante est renvoyée. Vous pouvez voir la valeur renvoyée sur la console.

{
  "id": "###",
  "name": "###",
  "mimeType": "###"
}

Remarque:

  • Lorsque vous avez modifié le script des applications Web, veuillez redéployer les applications Web en tant que nouvelle version. Ainsi, le dernier script est reflété dans les applications Web. Veuillez faire attention à cela.

Références:

  • Applications Web
  • Tirer parti des applications Web avec Google Apps Script
1 JeffRush Aug 18 2020 at 21:23

Essayez de télécharger votre fichier photo à l'aide de cet extrait:

// download file from website 
const http  = require('https')
const fs    = require('fs')

let file    = fs.createWriteStream('Photo001.jpg')
let request = http.get(
    'https://ssl.gstatic.com/ui/v1/icons/mail/rfr/logo_gmail_lockup_default_2x.png', 
    (response) => {
        response.pipe(file)
    })

// upload file to Google Drive
let fileMetadata = {
  'name'    : 'Photo001',
  'mimeType': 'image/jpeg'
}

let media = {
  mimeType  : 'image/jpeg',
  body      : fs.createReadStream('Photo001.jpeg')
}

function uploadFile(auth){

  const drive = google.drive({version: 'v3', auth})

  drive.files.create({
    resource: fileMetadata,
    media   : media,
    fields  : 'id'
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err)
  })

}

Documentation

  • Fichiers: créer