Как загрузить zip / rar файл на Google диск с помощью Google app script?

#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 браузер, и сайт перестанет работать без каких-либо ошибок. Есть идеи?