google apps script - script - Advanced Drive Service devuelve Empty Empty Error al insertar el archivo
script developers (1)
El tamaño de tu archivo es el factor determinante aquí. Hacer referencia a la documentación sugiere que el método de carga simple que se utiliza aquí es válido solo para hasta 5 MB.
https://developers.google.com/drive/web/manage-uploads
Sus comentarios parecen confirmar que esto es lo que está sucediendo para usted.
Como insinuó, use el método de carga reanudable. Use el uploadType: resumable
parámetro uploadType: resumable
documentos API en el método insert describen cómo uploadType: resumable
.
Esta es una continuación de Cómo usar el servicio de unidad avanzada para cargar archivos .
My Webapp consiste en un formulario de carga de archivos de datos, que luego se almacenan en Google Drive. (Código completo en el fragmento a continuación). Tengo un problema con la siguiente línea de código:
var file = Drive.Files.insert(resource, mediaData); // create file using Drive API
try {
//Get root folder and pull all existing folders, plus setup variables pulled from form
var dropbox = form.Country;
var timeStamp = new Date();
//Set file name slightly differently for Weekly Member Report (do not want to overright based on name just keep each extract so add timestamp to name)
if (form.reportType == "Member Weekly"){
var filename = form.reportType + timeStamp + ".xls";
}
else
{
var filename = form.reportType+".xls";
}
var rootfolder = DriveApp.getFolderById("0Byvtwn42HsoxfnVoSjB2NWprYnRiQ2VWUDZEendNOWwwM1FOZk1EVnJOU3BxQXhwU0pDSE0");
//Note root folder is Live Uploads Folder in Flatworld App folder structure
var folder, folders = rootfolder.getFoldersByName(dropbox);
//Check if folder exists and if not create
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = rootfolder.createFolder(dropbox);
}
var FolderURL = folder.getUrl(); // Retain URL of folder for final end message to user
//Check if file already exists and delete if it does
var file, files = folder.getFilesByName(filename);
while( files.hasNext()){
file = files.next();
file.setTrashed(true);
}
//New Code from Stackover Flow:
//Upload file and set various properties
var mediaData = form.myFile;
var resource = {
title: filename,
mimetype: ''application/vnd.ms-excel'',
description: "Uploaded via BNI Upload Form by " + form.myName + " on: " + timeStamp
};
var file = Drive.Files.insert(resource, mediaData); // create file using Drive API
var fileId = file.id;
var DriveAppFile = DriveApp.getFileById(fileId); // retrieve file in DriveApp scope.
var FileURL = DriveAppFile.getUrl(); //Retain URL of file for final end message to user
DriveApp.removeFile(DriveAppFile); // remove new file from Users root My Drive
folder.addFile(DriveAppFile); // puts file in selected folder
//End of New code from Stackover Flow
//Success message displayed to user
return "Thanks! File uploaded successfully to: <br><br><b>Folder Location:</b> " + FolderURL + "<br>" + "<b>File:</b> " + FileURL + ". <br><br>For any queries please email [email protected] copying the URLs displayed here in your email. You can close this browser window now or use the link below to upload another file.<br><br>";
} catch (error) {
//Catch error return it to user and email with error details
Está lanzando el mensaje de error "Respuesta vacía" en la línea de código anterior cuando intentamos subir un archivo grande (15 MB) ¿Tiene alguna sugerencia? Esto está dentro del límite de inserción de archivos de 5120GB y el código funciona bien en archivos más pequeños.
Ahora he intentado agregar un bucle en la función para intentar cargarlo un par de veces, y todavía estoy lanzando el mismo error con tristeza:
//setup function that will return null if file is not uploaded correctly
function createDriveFile(resource_f, mediaData_f){
try{
var file = Drive.Files.insert(resource_f, mediaData_f); // create file using Drive API
return file;
} catch (e) {return null;}
}
//try upload and loop if null
var maxTries = 3;
var tries = 0;
do {
tries = tries + 1;
if (tries > 0) {
var file = createDriveFile(resource, mediaData);
Logger.log("I''m trying to upload, try number: " + tries);
}
} while ((file == null) && (tries < maxTries));
if (file == null) {
var file = Drive.Files.insert(resource, mediaData); // try one laste time to create file using Drive API - outside loop function so if error is thrown script stops
}
El error solo parece ocurrir en un archivo más grande, incluso si reducimos el tamaño del mismo archivo que resuelve el error, así que tenemos que ajustar el proceso de carga para tener en cuenta un archivo más grande. ¿Hay un equivalente en Google Apps Script para hacer que la solicitud de subida de la API sea reanudable ?