2017-02-14 13 views
2

Мой вопрос точно такой: Upload a file to a Google Web Apps with doPostКак загрузить файл через POST (doPost) в веб-приложение Google Script?

Как загрузить файл непосредственно в веб-приложение Google Script из другого домена? Я ответил на обходной путь в этом вопросе, чтобы преобразовать файл в строку base64, но вопрос остается. Можно ли загрузить файл в Google Scripts или только в строки?

ответ

4

Файлы не могут быть загружены непосредственно с помощью «doPost()» GAS из формы HTML на локальном компьютере. Потому что «multipart/form-data» может не использоваться для «doPost()». Поэтому преобразование Base64 приводит к решению, как вы говорите.

Существует 2 способа загрузки файлов с помощью «doPost()».

1. Загрузить файл из HTML формы на газовом проекте

Это загружает файл с помощью GAS и HTML в проекте ГАЗ. В этом случае файл не конвертирует в Base64 скрипт. (Это может конвертировать как внутренний процесс.)

2. Загрузить файл из HTML формы на локальном компьютере

Это загружает файл из HTML формы на локальном компьютере. GAS контролирует «doPost()». В этом случае файл закодирован на Base64 и загружается как текстовые данные, а затем декодируется в файл с использованием GAS.


1. Загрузить файл из HTML формы на проекте ГАЗ

Правило:

  1. После пример сценария и HTML должны быть сделаны в проекте Google Apps Script.

  2. Разверните проект GAS как веб-приложение. https://developers.google.com/apps-script/guides/web И получить URL.

  3. После обновления сценария он должен быть обновлен как новая версия.

form.html:

<html> 
    <body> 
    <form> 
     <input type="file" name="upFile"> 
     <input type="button" value="ok" onclick="google.script.run.upload(this.parentNode)"> 
    </form> 
    </body> 
</html> 

Script:

function doGet() { 
    return HtmlService.createHtmlOutputFromFile('Form.html'); 
} 

function upload(e) { 
    DriveApp.createFile(e.upFile); 
} 

2. Загрузить файл из HTML формы на локальном компьютере

Правило почти такое же, как и выше. Сценарий помещается в проект GAS. Но HTML-форма размещается на локальном ПК.

Script:

function doGet(e) { 
    return message("Error: no parameters"); 
} 

function doPost(e) { 
    if (!e.parameters.filename || !e.parameters.file) { 
    return message("Error: Bad parameters"); 
    } else { 
    var data = Utilities.base64Decode(e.parameters.file, Utilities.Charset.UTF_8); 
    var blob = Utilities.newBlob(data, MimeType.PNG, e.parameters.filename); 
    DriveApp.createFile(blob); 
    return message("completed"); 
    } 
} 

function message(msg) { 
    return ContentService.createTextOutput(JSON.stringify({result: msg})).setMimeType(ContentService.MimeType.JSON); 
} 

HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script> 
</head> 
<body> 
    <input type="file" id="file"> 

    <script type="text/javascript"> 
     $(function(){ 
      var url = 'https://script.google.com/macros/s/[Project ID]/exec'; 
      var params = { 
       filename: 'samplefile', 
       imageformat: 'PNG' 
      }; 

      $('#file').on("change", function() { 
       var file = this.files[0]; 
       var fr = new FileReader(); 
       fr.onload = function(e) { 
        params.file = e.target.result.replace(/^.*,/, ''); 
        postJump(); 
       } 
       fr.readAsDataURL(file); 
      }); 

      function postJump(){ 
       var html = '<form method="post" action="'+url+'" id="postjump" style="display: none;">'; 
       Object.keys(params).forEach(function (key) { 
        html += '<input type="hidden" name="'+key+'" value="'+params[key]+'" >'; 
       }); 
       html += '</form>'; 
       $("body").append(html); 
       $('#postjump').submit(); 
       $('#postjump').remove(); 
      } 
     }); 
    </script> 
</body> 
</html> 

Этот сценарий предполагает, чтобы загрузить файл в формате PNG в качестве теста. Если вы хотите загрузить другие файлы, измените тип mime. https://developers.google.com/apps-script/reference/base/mime-type

Для образца HTML файл загружается при выборе файла.

Если это будет полезно для вас, я рад.

+0

Благодарим вас за разъяснение. Я уже знаю о файлах base64, но не был уверен, что была разрешена прямая загрузка файлов. –

+0

@Tanaike это очень полезно, как и ваш блог. Спасибо за вашу большую работу! – duhaime

+1

@duhaime Добро пожаловать. Спасибо, что остановились в моем блоге. – Tanaike

 Смежные вопросы

  • Нет связанных вопросов^_^