Cargue la imagen desde la URL a Google Drive a través de la API de Google Drive Javascript

Aug 18 2020

Soy nuevo en Javascript y lo siento si mi pregunta le parece poco convincente. Quiero subir una imagen de mi sitio web a mi Google Drive. He implementado con éxito la parte de autenticación y creación de carpetas, pero estoy confundido sobre el proceso de carga.
Digamos que este es mi código para crear una carpeta dentro de 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;
    }
  });
}

Ahora quiero cargar mi imagen desde esta url: https://xxxxxx.comen la carpeta recién creada desde la respuesta superior ( file.id)

Esto es lo que obtuve en la documentación de la API de Google, pero ¿dónde debo poner / adjuntar mi 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);
    }
  });
}   

Muchas gracias por adelantado.

Respuestas

1 Tanaike Aug 19 2020 at 08:26

Creo que su objetivo es el siguiente.

  • Desea descargar un archivo desde una URL y cargar el archivo descargado en Google Drive usando Javascript.
  • En su caso, gapi.clientpuede utilizar su para cargar el archivo en Google Drive.

Puntos de modificación:

  • En la etapa actual, lamentablemente, parece que gapi.client.drive.files.createaún no se puede enviar la solicitud con el contenido incluido. Ref Entonces, en este caso, me gustaría proponer usarlo fetchcomo una solución alternativa. Cuando fetchse utiliza, el contenido del archivo y los metadatos se pueden solicitar con multipart/form-data.
  • En esta solución alternativa, se utiliza el token de acceso de gapi.client. Entonces, este script supone que gapi.clientse puede usar para cargar el archivo. Tenga cuidado con esto.

Guión modificado:

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));
});
  • Cuando ejecuta este script, el siguiente resultado se puede ver en la consola. (Cuando la URL es el enlace directo del archivo de imagen Jpeg).

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

Nota:

  • En este caso, uploadType=multipartse utiliza. Entonces, el tamaño máximo de archivo es de 5 MB. Tenga cuidado con esto. Cuando desee utilizar más de 5 MB, marque Carga reanudable. Árbitro

Referencias:

  • Usando Fetch
  • Cargar datos de archivo

Adicional:

Para evitar el error relacionado con CORS, como otro método, me gustaría proponer el uso de Web Apps como envoltorio. En este caso, el lado del cliente es Javascript. Este Javascript se puede utilizar fuera de Google.

Uso:

Realice el siguiente flujo.

1. Cree un nuevo proyecto de Google Apps Script.

El script de muestra de Web Apps es un script de Google Apps. Por lo tanto, cree un proyecto de Google Apps Script.

Si desea crearlo directamente, acceda a https://script.new/. En este caso, si no ha iniciado sesión en Google, se abre la pantalla de inicio de sesión. Así que inicie sesión en Google. Con esto, se abre el editor de secuencias de comandos de Google Apps Script.

2. Prepare el guión.

Copie y pegue la siguiente secuencia de comandos (Google Apps Script) en el editor de secuencias de comandos. Este script es para las aplicaciones web.

Lado del servidor: Google Apps Script

Este script se utiliza para aplicaciones web. En este caso, las aplicaciones web se utilizan como contenedor.

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. Implementar aplicaciones web.

  1. En el editor de secuencias de comandos, abra un cuadro de diálogo con "Publicar" -> "Implementar como aplicación web".
  2. Seleccione "Yo" para "Ejecutar la aplicación como:" .
    • Con esto, el script se ejecuta como propietario.
  3. Seleccione "Cualquiera, incluso anónimo" para "Quién tiene acceso a la aplicación:" .
  4. Haga clic en el botón "Implementar" como nueva "Versión del proyecto".
  5. Abre automáticamente un cuadro de diálogo de "Se requiere autorización".
    1. Haga clic en "Revisar permisos".
    2. Seleccione su propia cuenta.
    3. Haga clic en "Avanzado" en "Esta aplicación no está verificada".
    4. Haga clic en "Ir a ### nombre del proyecto ### (inseguro)"
    5. Haga clic en el botón "Permitir".
  6. Haga clic en Aceptar".
  7. Copie la URL de las aplicaciones web. Es como https://script.google.com/macros/s/###/exec.
    • Cuando modificó Google Apps Script, vuelva a implementarlo como una nueva versión. De esta manera, el script modificado se refleja en Web Apps. Tenga cuidado con esto.

4. Cargue un archivo del lado del cliente al lado del servidor.

Lado del cliente: HTML y Javascript

Configure la URL de sus aplicaciones web en el siguiente script. Y configure el nombre del archivo y la ID de la carpeta.

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

Cuando se ejecuta el script anterior, se devuelve el siguiente valor. Puede ver el valor devuelto en la consola.

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

Nota:

  • Cuando modificó la secuencia de comandos de las aplicaciones web, vuelva a implementar las aplicaciones web como una nueva versión. De esta forma, la última secuencia de comandos se refleja en las aplicaciones web. Tenga cuidado con esto.

Referencias:

  • Aplicaciones web
  • Aprovechamiento de las aplicaciones web con Google Apps Script
1 JeffRush Aug 18 2020 at 21:23

Intente cargar su archivo de foto con este fragmento:

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

}

Documentación

  • Archivos: crear