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

时间:2014-06-21 09:41:45

标签: google-apps-script multipartform-data

我需要将文件上传到第三方服务。这些文件是在Google云端硬盘上创建的,我会获取它的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--

这是执行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
}

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

接收方发出错误(缺少来源)。我不确定我的多部分帖子在第一时间是否合适,我找不到任何测试网址来检查我是否正确上传。

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

1 个答案:

答案 0 :(得分:1)

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

但是,有一种更简单的方法。无需自己构建有效负载字符串,您只需将一个javascript对象设置为有效负载,UrlFetchApp将自动生成适当的有效负载字符串,选择正确的内容类型,边界和大多数其他选项。只需将HTML表单输入字段的“名称”属性用作对象键即可。对于文件,请使用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());
}