#javascript #google-apps-script #jszip
#javascript #google-apps-script #jszip
Вопрос:
Как загрузить zip / rar файл на Google диск с помощью Google app script? Я попробовал этот код ниже .gs в Google app script:
function doPost(e) {
try {
var data = e.parameter.fileContent;
var filename = e.parameter.filename;
var email = e.parameter.email;
var name = e.parameter.name;
var result=uploadFileToGoogleDrive(data,filename,name,email,e);
return redirect();
} catch(error) {
Logger.log(error);
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": error}))
.setMimeType(ContentService.MimeType.JSON);
}
}
var SCRIPT_PROP = PropertiesService.getScriptProperties();
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet();
SCRIPT_PROP.setProperty("key", doc.getId());
}
function record_data(e,fileUrl) {
try {
var doc = SpreadsheetApp.openById(SCRIPT_PROP.getProperty("key"));
var sheet = doc.getSheetByName('datasheet'); // select the responses sheet
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow() 1; // get next row
var row = [ new Date() ]; // first element in the row should always be a timestamp
// loop through the header columns
for (var i = 1; i < headers.length; i ) { // start at 1 to avoid Timestamp column
if(headers[i].length > 0 amp;amp; headers[i] == "Zip-Link") {
row.push(fileUrl); // add data to row
}
else if(headers[i].length > 0) {
row.push(e.parameter[headers[i]]); // add data to row
}
}
// more efficient to set values as [][] array than individually
sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);
}
catch(error) {
Logger.log(e);
}
finally {
return;
}
}
function uploadFileToGoogleDrive(data, file, name, email,e) {
try {
var dropbox = "dropbox";
var folder, folders = DriveApp.getFoldersByName(dropbox);
if (folders.hasNext()) {
folder = folders.next();
} else {
folder = DriveApp.createFolder(dropbox);
}
var date = Utilities.formatDate(new Date(), "GMT 1", "dd/MM/yyyy")
var contentType = data.substring(5,data.indexOf(';')),
bytes = Utilities.base64Decode(data.substr(data.indexOf('base64,') 7)),
blob = Utilities.newBlob(bytes, contentType, file);
var file = folder.createFolder([date, email].join("--")).createFile(blob);
var fileUrl=file.getUrl();
record_data(e,fileUrl); //record data into my excel
} catch (f) {
return ContentService // return json success results
.createTextOutput(
JSON.stringify({"result":"file upload failed",
"data": JSON.stringify(f) }))
.setMimeType(ContentService.MimeType.JSON);
}
}
function redirect() {
return HtmlService.createHtmlOutput(
"<script>window.top.location.href="" REDIRECT_URL "";</script>"
);
}
Я не знаю, является ли это Utilities.base64Decode неправильным или что-то еще, потому что я могу загрузить файл, но это выдает мне ошибку о поврежденном файле или неправильном формате после того, как я попытался загрузить и открыть его, кто-нибудь может сказать мне, в чем моя ошибка??
В дополнение к тому, как я получаю URL-адрес данных файлов и заархивирую их вместе:
function dataURItoBlob(dataURI) {
var byteString = atob(dataURI.split(',')[1]);
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i ) {
ia[i] = byteString.charCodeAt(i);
}
var blob = new Blob([ab], {type: mimeString});
return blob;
}
function getfile() {
var zip = new JSZip();
for(let i = 0; i < testpush.length; i ){
var aFileName = "image" i 1 ".jpg";
var aContent = dataURItoBlob(testpush[i]); //content of file
//put files onto a folder
zip.folder("Image_folder").file(aFileName, aContent)
}
zip.generateAsync({type:"base64"})
.then(function (content) {
fileData = "data:application/zip;base64," content;
document.getElementById('fileContent').value = fileData;
});
}
Сценарий отправки данных на Google Диск в HTML:
<form id="uploadForm" name="form-uploadForm" data-name="uploadForm" method="post" action="MyGoogleAppScirptLink" class="buyerform">
<textarea placeholder="Example Text"
id="fileContent" name="fileContent" data-name="fileContent" class="input"
spellcheck="false"></textarea>
<label class="img_label" for="placeholder_input">
<div class="plus"></div>
</label>
<input type='file' id="placeholder_input" class="hidden" accept="image/*" onchange='openFiles(event)' multiple>
<input id='sumbit-bill-now' class='submit-display-none' value='check it' type='button' onclick='getfile();' />
</form>
Комментарии:
1. Куда вы звоните
uploadFileToGoogleDrive
и с какими параметрами?2. Я только что обновил
doPost()
функцию файла .gs, спасибо, что пытались мне помочь.3. Чтобы подтвердить процесс загрузки, можете ли вы предоставить скрипт для загрузки файла в
doPost
?4. @Tanaike Сначала я выбираю pics и загружаю его в браузер с помощью FileReader(), чтобы прочитать pics как dataurl и преобразовать его в blob и заархивировать его с помощью Jszip и получить dataurl из Jszip, затем использую document.getElementById(‘fileContent’), чтобы установить значение = dataURL Zip-файла и отправить форму в Google app script для doPost();
5. @Tanaike Кстати, я просто узнаю, как только установлю
document.getElementById('fileContent') to set value = to DataUrl of Zip file
браузер, и сайт перестанет работать без каких-либо ошибок. Есть идеи?