如何从 google 驱动程序脚本中的 post 请求接收 --data-binary
How to receive --data-binary from post request in google drive app script
这是我的请求
curl --location --request POST 'https://script.google.com/macros/s/{My Web app url}/exec' \
--header 'Content-Type: application/octet-stream' \
--header 'fileName: MyFileName' \
--header 'mimeType: application/octet-stream' \
--data-binary '@/Location/To/My/Local/File'
我正在尝试在我的 google 云端硬盘应用程序脚本中接收此请求
function doPost(e) {
var data = Utilities.base64Decode(e.postData.contents); <---- having issue with this line
var blob = Utilities.newBlob(data, e.postData.type, "TempFile");
var fileId = DriveApp.createFile(blob);
return ContentService.createTextOutput("fileName:"+fileName + " fileId:" + fileId);
}
该文件是二进制文件,不是图像不是 zip,而是其他类型的二进制文件
我需要写什么才能让它工作?
修改点:
- 在 Web Apps 中,字符串值是从
doPost(e)
的事件对象 e
中检索的。在这种情况下,当使用你的curl命令时,我认为可能是由于字符编码的问题导致二进制数据无法正确发送。我很担心这个。
- 而且,当我看到您的 Web Apps 脚本时,您正在尝试解码 base64 数据。但是 curl 命令没有将文件数据作为 base64 发送。
- 在您的脚本中,似乎没有声明
fileName
。
- 在Web Apps,在现阶段,不幸的是,Web Apps端无法获取到请求头。好像这是目前的规范。
当以上几点反映到你的curl命令和脚本中时,就会变成如下。
修改后的 curl 命令:
为了将文件数据作为base64数据发送,下面修改的curl命令怎么样?
curl --location 'https://script.google.com/macros/s/{My Web app url}/exec' \
--header 'Content-Type: application/octet-stream' \
--data '{"file":"'"$(base64 /Location/To/My/Local/File)"'","filename":"sampleFilename"}'
- 通过这个curl命令,文件被转换为base64数据并发送到Web Apps。
已修改 Google Apps 脚本:
为了使用上面curl命令的数据,下面的修改怎么样?
function doPost(e) {
var contents = JSON.parse(e.postData.contents.replace(/\n/g, ""));
var fileName = contents.filename;
var data = Utilities.base64Decode(contents.file);
var blob = Utilities.newBlob(data, e.postData.type, fileName);
var fileId = DriveApp.createFile(blob);
return ContentService.createTextOutput("fileName:" + fileName + " fileId:" + fileId);
}
注:
- 在您的 Web Apps 脚本中,
fileName
未声明。所以文件名是用 curl 命令发送的。
- 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
- 您可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中看到详细信息。
参考文献:
这是我的请求
curl --location --request POST 'https://script.google.com/macros/s/{My Web app url}/exec' \
--header 'Content-Type: application/octet-stream' \
--header 'fileName: MyFileName' \
--header 'mimeType: application/octet-stream' \
--data-binary '@/Location/To/My/Local/File'
我正在尝试在我的 google 云端硬盘应用程序脚本中接收此请求
function doPost(e) {
var data = Utilities.base64Decode(e.postData.contents); <---- having issue with this line
var blob = Utilities.newBlob(data, e.postData.type, "TempFile");
var fileId = DriveApp.createFile(blob);
return ContentService.createTextOutput("fileName:"+fileName + " fileId:" + fileId);
}
该文件是二进制文件,不是图像不是 zip,而是其他类型的二进制文件
我需要写什么才能让它工作?
修改点:
- 在 Web Apps 中,字符串值是从
doPost(e)
的事件对象e
中检索的。在这种情况下,当使用你的curl命令时,我认为可能是由于字符编码的问题导致二进制数据无法正确发送。我很担心这个。 - 而且,当我看到您的 Web Apps 脚本时,您正在尝试解码 base64 数据。但是 curl 命令没有将文件数据作为 base64 发送。
- 在您的脚本中,似乎没有声明
fileName
。 - 在Web Apps,在现阶段,不幸的是,Web Apps端无法获取到请求头。好像这是目前的规范。
当以上几点反映到你的curl命令和脚本中时,就会变成如下。
修改后的 curl 命令:
为了将文件数据作为base64数据发送,下面修改的curl命令怎么样?
curl --location 'https://script.google.com/macros/s/{My Web app url}/exec' \
--header 'Content-Type: application/octet-stream' \
--data '{"file":"'"$(base64 /Location/To/My/Local/File)"'","filename":"sampleFilename"}'
- 通过这个curl命令,文件被转换为base64数据并发送到Web Apps。
已修改 Google Apps 脚本:
为了使用上面curl命令的数据,下面的修改怎么样?
function doPost(e) {
var contents = JSON.parse(e.postData.contents.replace(/\n/g, ""));
var fileName = contents.filename;
var data = Utilities.base64Decode(contents.file);
var blob = Utilities.newBlob(data, e.postData.type, fileName);
var fileId = DriveApp.createFile(blob);
return ContentService.createTextOutput("fileName:" + fileName + " fileId:" + fileId);
}
注:
- 在您的 Web Apps 脚本中,
fileName
未声明。所以文件名是用 curl 命令发送的。 - 当您修改 Google Apps 脚本时,请将部署修改为新版本。这样,修改后的脚本就会反映到 Web 应用程序中。请注意这一点。
- 您可以在“Redeploying Web Apps without Changing URL of Web Apps for new IDE”的报告中看到详细信息。