【问题标题】:Can I use google utilities unzip in JavaScript on the browser client?我可以在浏览器客户端上使用 google 实用程序在 JavaScript 中解压缩吗?
【发布时间】:2014-03-11 03:46:28
【问题描述】:

我试图弄清楚使用谷歌脚本将图像从用户硬盘复制到他们谷歌驱动器上的公共文件夹的流程。 (见https://developers.google.com/apps-script/reference/utilities/utilities#unzip%28BlobSource%29)问题是,我是否必须编写一个谷歌脚本,从script.google.com作为网络应用程序发布,或者我可以在客户端浏览器的javascript中包含脚本吗? Google 有一个一次上传一张图片的示例:“developers.google.com/drive/web/quickstart/quickstart-js”

我想上传一个压缩的图片文件,解压缩它们,然后在将它们存储到用户的 Google 云端硬盘之前缩小大小。

这是一些解压缩文件的代码,但看起来他们是从 script.google.com 运行的;它不起作用:(http://webcache.googleusercontent.com/search?q=cache:NsTvlj17H4MJ:ctrlq.org/code/19506-google-drive-hosting&client=firefox-a&hs=ZEF&hl=en&gl=us&strip=1)

【问题讨论】:

    标签: javascript google-apps-script unzip utilities


    【解决方案1】:

    This 是我为另一个用户修改的脚本,它允许将多个文件(验证可能会将文件类型限制为图像)从用户的硬盘驱动器上传到特定文件夹。该文件夹将设置为公开共享。您只需将 folderID 字符串更改为与您希望文件到达的文件夹匹配的字符串。将此脚本放在 Google 站点页面中,并在 doPost(e) 函数中更改 id,它应该会执行您希望它执行的操作。我不确定压缩和解压缩。您可以在 google 站点中将脚本作为公共 webapp 小部件发布。

    您可以看到 UiApp 界面here,但是如果您尝试上传某些内容,则会收到错误消息,因为自从我发布此答案后,我已经删除了指向我的驱动器的 folderId 链接。如果您需要更多关于它如何工作或为什么工作的解释,请告诉我。使用 + 和 - 按钮将更多文件添加到上传文件,或删除您不想包含的文件。文件可以是 zip 文件或任何文件类型,但不包含用于在上传后解压缩任何内容的代码。

    //modified from script found here http://www.googleappsscript.org/miscellaneous/creating-form-elements-dynamically-using-google-apps-script-gas
    //additional help from Serge to fix an error in my original code.
    
    function doGet() {
      var app = UiApp.createApplication();
      var panel = app.createVerticalPanel();
      var formPanel = app.createFormPanel();
      var instructionsLabel = app.createLabel('Put your instructions here');
      var filesLabel = app.createLabel('Add Files to Upload');
      var table = app.createFlexTable().setId('table').setTag('0'); //Here tag will count the number of files
      //Write the header for the table
      var header = app.createLabel('File(s)');
      table.setWidget(0, 0, header);
    
      //Add the first row of files
      addFirstRow(app);
      var hidden = app.createHidden().setId('hiddenRowHolder').setName('hidden').setValue(table.getTag());
      //Add a button to submit the info
      var button = app.createSubmitButton('Upload File(s)');
      panel.add(instructionsLabel).add(filesLabel).add(table).add(hidden).add(button);
      formPanel.add(panel);
      app.add(formPanel);
      return app;
    }
    
    function addFirstRow(app){
      var table = app.getElementById('table');
      var tag = parseInt(table.getTag());
      Logger.log(tag);
      var numRows = tag+1;
      if(numRows >1){
        table.removeCell(numRows-1, 5);
        table.removeCell(numRows-1, 4);
      }
      Logger.log(numRows);
      var uploadWidget = app.createFileUpload();
      table.setWidget(numRows, 0, uploadWidget);
      table.setTag(numRows.toString());
      addButtons(app);
    }
    
    function addButtons(app){
      var table = app.getElementById('table');
      var numRows = parseInt(table.getTag());
    
    
      //Create handler to add/remove row
      var addRemoveRowHandler = app.createServerHandler('addRemoveRow');
      addRemoveRowHandler.addCallbackElement(table);
    
      //Add row button and handler
      var addRowBtn = app.createButton('+').setId('addOne').setTitle('Add row');
      table.setWidget(numRows, 4, addRowBtn);
      addRowBtn.addMouseUpHandler(addRemoveRowHandler);
    
      //remove row button and handler
      var removeRowBtn = app.createButton('-').setId('removeOne').setTitle('Remove row');
      table.setWidget(numRows, 5, removeRowBtn);
      removeRowBtn.addMouseUpHandler(addRemoveRowHandler);
    }
    
    function addRemoveRow(e){
      Logger.log(e.parameter.source);
      var app = UiApp.getActiveApplication();
      var table = app.getElementById('table');
      var tag = parseInt(e.parameter.table_tag);
      var hidden = app.getElementById('hiddenRowHolder');
      var source = e.parameter.source;
      //Logger.log(tag);
      if(source == 'addOne'){
        table.setTag(tag.toString());
        hidden.setValue(tag+1);
        addFirstRow(app);
      }
      else if(source == 'removeOne'){
        if(tag > 1){
          //Dcrement the tag by one
          var numRows = tag-1;
          table.removeRow(tag);
          //Set the new tag of the table
          table.setTag(numRows);
          hidden.setValue(numRows);
          //Add buttons in previous row
          addButtons(app); 
        }
      }
      return app;
    }
    
    function doPost(e) {
      var numFiles = Number(e.parameter.hidden);
      Logger.log(numFiles);
      for (var i = 1; i<=numFiles; i++){
        var fileBlob = e.parameter['file'+i];
        var newFile = DocsList.getFolderById("YOUR FILE FOLDER ID").createFile(fileBlob);//replace string with folder id where you want to place your files
      }
      var app = UiApp.getActiveApplication();
      var label = app.createLabel(numFiles +' file(s) uploaded successfully');
      app.add(label);
      return app;
    }
    

    【讨论】:

    • 谢谢。如何从我的 javascript 调用此脚本,而无需用户导航到 sites.google.com?
    • 您可以将其部署为独立应用程序,但您可能必须使用 OAuth 来授予访问权限。最好/最安全的方法是将应用程序嵌入谷歌网站或将其重写为电子表格中容器绑定脚本中的对话框(但电子表格对于此应用程序无用)。将小部件放置在 google 站点页面上非常简单,尤其是当您位于使用 Google for Business 应用的封闭式商业网络中时,因为您可以将访问权限限制在您的企业域中的用户。
    • 谢谢。你提到“最安全”的方式?您的意思是从许多使用此应用程序将文件上传到他们的 G.Drive 的人那里保存?如果很多人将 API 用作独立应用程序来将图像上传到他们的 Google 云端硬盘,我最终是否会向 API 支付费用?
    • 我假设您正在创建一个公共存储库来存储文件(就像任何人都可以从中取出文件的库存箱),并且会指定一个特定文件夹来放置您是管理员的文件的。最安全的意思是,您不希望互联网上的任何人能够将他们想要的任何文件上传到您的艺术团队的 Google Drive 通用文件存储库中。
    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多