#google-apps-script
#google-apps-script
Вопрос:
Я пытаюсь опубликовать любой тип файла с помощью скрипта Google Apps в веб-приложении, но я не знаком с doPost.
Мой код выглядит так:
function call(){
var file = getFile('/2.html'); //gets a file from my Google Drive (no point in posting all the code here for that)
var options = {
'method' : 'post',
'payload' : {file : file}
};
var response = UrlFetchApp.fetch('https://script.google.com/macros/s/AKfycbx0aIU_XjOHPXh0P6y2dTMmvGpI6WAuac_Cq5BOGw7nDLRlodT-/exec',options)
Logger.log(response)
Кажется, это работает, хотя я читал, что мне нужно, чтобы base64 кодировал файл, чтобы он работал правильно. Это то, чего я действительно не понимаю.
На стороне веб-приложения я сделал doPost (e), но независимо от того, что я пытался сделать с ‘e’, я не могу понять, что это за объект и как его обрабатывать. Все, что я хочу сделать на самом деле, это сохранить его на Google Диске.
Вам может быть интересно, почему я так долго отправляю файл на диск через веб-приложение, когда я мог бы сохранить его напрямую. Причина в том, что я пытаюсь выполнить процесс асинхронно, используя UrlFetchApp.fetchAll(), чтобы ускорить процесс записи большого количества файлов на диск одновременно.
Комментарии:
1. С чем вы пытались
e
? На какую документацию вы ссылались до сих порe
? Если да, какую часть или строку документации вам трудно понять?2. Привет @theMaster Я пробовал: Utilities.newBlob((например,postData.contents), например,parameter.mimeType, например, parameter. имя файла); Я смог определить, что это file=[Ljava.lang . Object% Я попробовал его синтаксический анализ в формате JSON, но я получаю ошибку при первом символе. Я не нашел никакой документации о том, как анализировать файл с помощью doGet или doPost. Я нашел только документацию о том, как работать с текстом.
3. Если я отображаю e.parameters, то результатом будет просто [объект Object]
4. вы устали выполнять JSON.parse(x.getContentText ()) и проверьте эту ссылку, это что-то вроде того, что вы хотите сделать googleappscripting.com/json
5. @Doom Спасибо за это. Я решил это. Вы можете увидеть решение в другом потоке. На самом деле я передавал массив вместо файла, что усугубило мою первоначальную неспособность разобрать e .
Ответ №1:
Если переменная file
имеет тип File
, получите Blob
из File
и base64
закодируйте ее:
var options = {
'method' : 'post',
'payload' : Utilities.base64EncodeWebSafe(file.getBlob().getBytes())
};
В веб-приложении получателя расшифруйте его обратно:
const doPost = e => {
const file = DriveApp.createFile(
Utilities.newBlob(
Utilities.base64DecodeWebSafe(
e.postData.contents
)
)
)
}
Ответ №2:
Спасибо @TheMaster. Я внес некоторые изменения в код, потому что это привело к ошибке, поскольку требовалось имя файла. вам понадобится собственный URL-адрес веб-приложения apps script, чтобы перейти сюда [URL-адрес ВЕБ-приложения APPS SCRIPT]:
const doPost = e => {
const file = DriveApp.createFile(
Utilities.newBlob(
Utilities.base64DecodeWebSafe(
e.parameter.file
),e.parameter.contentType,e.parameter.fileName
)
)
}
function sendFile(file){
var fileName = file.getName();
var contentType = file.getBlob().getContentType();
var url = "[APPS SCRIPT WEB APP URL]";
var payload = {
fileName: fileName,
contentType : contentType,
file: Utilities.base64EncodeWebSafe(file.getBlob().getBytes())
};
var options = {
method: "POST",
payload: payload,
muteHttpExceptions : true,
};
var res = UrlFetchApp.fetch(url, options).getContentText();
}