UrlFetchApp 在 Google Apps 脚本中上传文件 multipart/form-data

Rië*_*iël 8 multipartform-data google-apps-script

我需要将文件上传到第三方服务。这些文件是在 Google Drive 上创建的,我获取了它的 blob 数据。

我想创建一个多部分请求,当我执行 UrlFetchApp Post 时,它现在看起来像这样。

这是字符串形式的有效负载。我有一些生成有效负载的代码。正确格式化不是问题,问题是它应该是的格式。

-----------------0.13accb4c42d338
Content-Disposition: form-data; name="source"; filename="Zzapps.jpg"
Content-Type: application/octet-stream

[[[IMAGE DATA HERE -- OMITTED FOR BREVITY]]]

-----------------0.13accb4c42d338
Content-Disposition: form-data; name="filename"

Zzapps.jpg
-----------------0.13accb4c42d338--
Run Code Online (Sandbox Code Playgroud)

这是执行 UrlFetchApp 命令的代码段。

var authHeaders = {
   Authorization: 'OAuth2 '+access_token
}
 var params = {
    accept: "application/json",
    method: 'POST',
    payload: payload,
    contentType: 'multipart/form-data; boundary='+boundaryKey,
    headers: authHeaders,
    ContentLength: payload.length,
    muteHttpExceptions: true
}
Run Code Online (Sandbox Code Playgroud)

var resx = UrlFetchApp.fetch(url, params);

接收方给出错误(缺少源)。我不确定我的多部分帖子一开始是否正常,我没有找到任何测试 URL 来检查我是否进行了正确的上传。

如何以正确的方式将 blob 数据作为分段上传发送?现在我使用 blob.getDataAsString() <-- 这是正确的吗?

bro*_*wly 13

如果您自己构建有效负载字符串,则需要执行 blob.getBytes(),而不是 blob.getDataAsString()。

然而,还有一个更简单的方法。您无需自己构建有效负载字符串,只需将 javascript 对象设置为有效负载,UrlFetchApp 将自动生成适当的有效负载字符串,选择正确的内容类型、边界和大多数其他选项。只需使用 HTML 表单输入字段的“name”属性作为对象键即可。对于文件,使用 blob 作为键的值。

function sendReportToSteve() {
  var url = "https://example.com/stevedore.html";
  var form = {
    date : new Date(),
    subject : "Happy birthday!",
    comment : "quakehashprismkeepkick",
    attachment1 : DriveApp.getFileById("sH1proy0lradArgravha9ikE").getBlob(),
    attachment2 : DriveApp.getFileById("traCetRacErI3hplVnkFax").getBlob()
  };
  uploadFile(url,form);
}

function uploadFile(url,form) {
  var options = {
    method : "POST",
    payload : form
  };
  var request = UrlFetchApp.getRequest(url,options);   // (OPTIONAL) generate the request so you
  console.info("Request payload: " + request.payload); // can examine it (useful for debugging)
  var response = UrlFetchApp.fetch(url,options);
  console.info("Response body: " + response.getContentText());
}
Run Code Online (Sandbox Code Playgroud)