Carica l'immagine dall'URL su Google Drive tramite JavaScript dell'API di Google Drive

Aug 18 2020

Sono nuovo in Javascript e mi dispiace se la mia domanda ti sembra noiosa. Voglio caricare un'immagine dal mio sito web sul mio Google Drive. Ho implementato con successo la parte di creazione di autenticazione e cartella, ma sono confuso sul processo di caricamento.
Dì che questo è il mio codice per creare una cartella all'interno di 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;
    }
  });
}

Ora voglio caricare la mia immagine da questo URL: https://xxxxxx.comnella cartella appena creata dalla risposta superiore ( file.id)

Questo è ciò che ho ottenuto nella documentazione dell'API di Google, ma dove dovrei inserire / allegare il mio 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);
    }
  });
}   

Grazie mille in anticipo.

Risposte

1 Tanaike Aug 19 2020 at 08:26

Credo il tuo obiettivo come segue.

  • Desideri scaricare un file da un URL e caricare il file scaricato su Google Drive utilizzando Javascript.
  • Nel tuo caso, gapi.clientpuoi essere utilizzato per caricare il file su Google Drive.

Punti di modifica:

  • Nella fase attuale, purtroppo, sembra che gapi.client.drive.files.createnon sia ancora possibile inviare la richiesta comprensiva del contenuto. Ref Quindi, in questo caso, vorrei proporre di utilizzare fetchcome soluzione alternativa. Quando fetchviene utilizzato, il contenuto del file ei metadati possono essere richiesti con multipart/form-data.
  • In questa soluzione alternativa, il token di accesso viene utilizzato da gapi.client. Quindi questo script suppone che il tuo gapi.clientpossa essere utilizzato per caricare il file. Per favore, stai attento.

Script modificato:

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));
});
  • Quando esegui questo script, il seguente risultato può essere visualizzato sulla console. (Quando l'URL è il collegamento diretto del file immagine Jpeg.)

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

Nota:

  • In questo caso, uploadType=multipartviene utilizzato. Quindi la dimensione massima del file è 5 MB. Per favore, stai attento. Se desideri utilizzare più di 5 MB, seleziona Caricamento ripristinabile. Rif

Riferimenti:

  • Utilizzando Fetch
  • Carica i dati del file

Aggiunto:

Per evitare l'errore relativo a CORS, come altro metodo, vorrei proporre di utilizzare le Web App come wrapper. In questo caso, il lato client è Javascript. Questo Javascript può essere utilizzato al di fuori di Google.

Utilizzo:

Si prega di eseguire il seguente flusso.

1. Crea un nuovo progetto di Google Apps Script.

Lo script di esempio di Web Apps è uno script di Google Apps. Quindi, crea un progetto di Google Apps Script.

Se vuoi crearlo direttamente, accedi a https://script.new/. In questo caso, se non sei loggato in Google, si apre la schermata di login. Quindi accedi a Google. In questo modo viene aperto l'editor di script di Google Apps Script.

2. Preparare lo script.

Copia e incolla il seguente script (Google Apps Script) nell'editor di script. Questo script è per le app Web.

Lato server: Google Apps Script

Questo script viene utilizzato per le app Web. In questo caso, le Web App vengono utilizzate come 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. Distribuire applicazioni Web.

  1. Nell'editor di script, apri una finestra di dialogo con "Pubblica" -> "Distribuisci come app web".
  2. Seleziona "Io" per "Esegui l'app come:" .
    • In questo modo, lo script viene eseguito come proprietario.
  3. Seleziona "Chiunque, anche anonimo" per "Chi ha accesso all'app:" .
  4. Fare clic sul pulsante "Distribuisci" come nuova "versione del progetto".
  5. Apre automaticamente una finestra di dialogo "Autorizzazione richiesta".
    1. Fai clic su "Verifica autorizzazioni".
    2. Seleziona il tuo account.
    3. Fai clic su "Avanzate" in "Questa app non è verificata".
    4. Fai clic su "Vai al nome del progetto ### ### (non sicuro)"
    5. Fare clic sul pulsante "Consenti".
  6. Fare clic su "OK".
  7. Copia l'URL delle app Web. È come https://script.google.com/macros/s/###/exec.
    • Quando hai modificato Google Apps Script, ridistribuiscilo come nuova versione. In questo modo, lo script modificato viene riflesso nelle app Web. Per favore, stai attento.

4. Carica un file dal lato client al lato server.

Lato client: HTML e Javascript

Imposta l'URL delle tue app Web sul seguente script. Inoltre, imposta il nome del file e l'ID della cartella.

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);
Risultato:

Quando viene eseguito lo script precedente, viene restituito il valore seguente. È possibile visualizzare il valore restituito sulla console.

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

Nota:

  • Quando hai modificato lo script delle app Web, ridistribuisci le app Web come nuova versione. In questo modo, l'ultimo script si riflette nelle app Web. Per favore, stai attento.

Riferimenti:

  • App Web
  • Sfruttare le app Web con Google Apps Script
1 JeffRush Aug 18 2020 at 21:23

Prova a caricare il file della tua foto utilizzando questo frammento:

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

}

Documentazione

  • File: crea