Google apps script 谷歌应用程序脚本中的UrlFetchApp上传文件多部分/表单数据

Google apps script 谷歌应用程序脚本中的UrlFetchApp上传文件多部分/表单数据,google-apps-script,multipartform-data,Google Apps Script,Multipartform Data,我需要上传文件到第三方服务。这些文件是在谷歌硬盘上创建的,我得到了它的blob数据 我想创建一个多部分请求,当我发布UrlFetchApp时,它现在看起来像这样 这是作为字符串的有效负载。我有一些生成有效负载的代码。将其正确格式化不是问题,而是应该采用的格式 -----------------0.13accb4c42d338 Content-Disposition: form-data; name="source"; filename="Zzapps.jpg" Content-Type: app

我需要上传文件到第三方服务。这些文件是在谷歌硬盘上创建的,我得到了它的blob数据

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

这是作为字符串的有效负载。我有一些生成有效负载的代码。将其正确格式化不是问题,而是应该采用的格式

-----------------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--
这是执行URLFACHTAPP命令的代码段

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,参数)

接收方提供了一个错误(缺少源)。首先,我不确定我的多部分帖子是否正常,我没有找到任何测试URL来检查我是否正确上传

我如何以多部分上传的方式发送blob数据?
现在我使用blob.getDataAsString()如果您自己构建负载字符串,那么您希望执行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());
}

在这种情况下,我从最简单的硬编码代码开始,然后开始工作。试着先做一些简单的工作。你看过死刑记录了吗?是否使用Logger.log()检查值?您的params对象是否被解析为对象?如果使用Logger.log('params:'+params);您应该将[object:object]视为params.Yes的值。我正在尝试发送一个硬编码的代码。我看不出有谁能做到这一点。我希望多部分代码是params.payload参数中的一个字符串?我知道这可能有点晚了,但在本文中-,这家伙搞定了它。这些信息对您的情况有用吗?在我的例子中,我没有任何HTML表单的输入字段。我正在尝试以以下格式发布电子邮件元数据和电子邮件内容
{meta:{id,subject,date},content:rawContent}
。使用上述方法如何实现这一点?@V.i.K.i我认为UrlFetchApp只能发出HTTP请求。据我所知,电子邮件是使用SMTP协议发送的,而不是HTTP协议。请尝试使用UrlFetchApp,而不是UrlFetchApp。对不起,我在之前的评论中不清楚。我不是想发邮件。我正在尝试使用上述格式的有效负载向第三方API发出HTTP POST请求。我发现内容类型没有正确设置。现在,我不得不退回到在上定义的方法。我想知道我们是否可以通过使用您的方法来避免这种情况。@V.I.K.I我认为UrlFetchApp只能处理一个“级别”的对象。对于子对象,您将希望编码为API期望的字符串(JSON、XML等)。例如,您可以尝试
var options={method:“POST”,有效负载:{meta:JSON.stringify({id:5,subject:“foo”,date:“2018-10-05”}),content:rawContent}
。您可能希望使用for
rawContent
。UrlFetchApp不知道如何处理任意字节数组。