首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合了二进制和文本负载的谷歌应用程序脚本UrlFetchApp()

混合了二进制和文本负载的谷歌应用程序脚本UrlFetchApp()
EN

Stack Overflow用户
提问于 2013-02-02 05:48:28
回答 2查看 2.1K关注 0票数 2

我正在尝试为一个third-party service从多个文档创建一个UrlFetchApp()有效负载。如果我效仿他们对多个内联文档的示例,UrlFetchApp()有效负载应该同时包含二进制文件(用于每个文件)和文本(用于分隔两段内容)。如何将此混合内容提供给payload高级参数?

我已经成功地使用.getBytes()对blob执行了二进制操作,如下所示:

代码语言:javascript
复制
function testfax() {
  var faxnum = '12125551234';
  var url = 'https://rest.interfax.net/outbound/faxes?faxNumber=+'+faxnum;
  Logger.log('url='+url)
  Logger.log(" ")

  var varAuthString = AuthString();  //user function to create HTTP simple authorization header
  //Logger.log(varAuthString)
  //Logger.log(" ")

  var accept = "application/xml";
  var meth = 'POST';

  var payloadBlob = testDocBlob("For-Testing-Fax");   //user function returns GAS blob mime type "application/pdf"
  var payload = [];
  payload = payloadBlob.getBytes();
  Logger.log(payload.length)
  var contentType = "application/pdf"
  var ContentLen = 0;
  var headers = 
    {
      "Accept": accept ,
      "Authorization": "Basic " + varAuthString
    }
  //Logger.log("headers= ")
  //Logger.log(headers)
  //Logger.log(" ")
  var options =
    {
      "method" : meth,
      "headers" : headers,
      "contentType":contentType,
      "contentLength": ContentLen,
      "payload" : payload
    };
  //Logger.log("options= ")
  //Logger.log(options)
  //Logger.log(" ")
  var r = UrlFetchApp.fetch(url,options);
  Logger.log(r.getResponseCode());
  Logger.log(r.getContentText());
  Logger.log(r.getHeaders());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-02 20:49:51

你已经得到了你需要的大部分代码,你只需要对它重新安排一下,并内置多部分处理。

我建议您修改您的传真发送函数,以处理一组文件blob。下面是测试函数的代码,构建数组并调用testfax()函数:

代码语言:javascript
复制
function testtestfax() {
  // Build an array with files for faxing.
  var files = [];
  // Repeat push line for multiple files.
  files.push(testDocBlob("For-Testing-Fax"));   //user function returns GAS blob mime type "application/pdf"
  testfax(files);
}

这样,您就可以根据文件数组的length来设置contentType。如果是单个文件,则使用contentType=fileBlob.getContentType(),否则使用适当的boundary参数执行contentType=multipart/mixed...

代码语言:javascript
复制
  if (files.length == 1) {
    var contentType = "application/pdf"
  }
  else {
    var boundary="265001916915724"
    var contentType = 'multipart/mixed; boundary="'+boundary+'"';
  }

您可以选择使用这样的硬编码边界-有趣的是,本例中的边界经常出现在搜索中。如果你能生成你自己的随机字符串就更好了。这都是在Section 5.1 of RFC2046, Multipurpose Internet Mail Extensions中描述的。

设置contentType后,构建消息的有效负载。如果是单个文件,则payload仅由files[0].getBytes()组成。否则,循环遍历files,并为每个值追加到payload

每个文件的多部分有效负载将包括:

  • 一个空行(CRLF),后跟..
  • 带有双连字符的boundary字符串,后跟...
  • 文件的content-type标记。跟随by...
  • files[i].getBytes()

files[i].getContentType()

然后,通过以下方式最终确定多部分有效负载:

  • 一个空行(CRLF),后跟...
  • 前后用双连字符括起来的boundary字符串,表示结束。

现有函数的最后一部分保持原样,使用上面构造的payload设置options,并使用fetch()发送它。您现在应该有了一个可以处理单个或多个传真的函数。

票数 2
EN

Stack Overflow用户

发布于 2013-12-14 01:27:38

下面是一个发布带有文本参数的pdf的示例

代码语言:javascript
复制
  var the_file = UrlFetchApp.fetch("http://www.education.gov.yk.ca/pdf/pdf-test.pdf").getBlob().setContentTypeFromExtension();
  var the_phone="444-444-4444";
  var the_filename="blaa.pdf";

  var boundary = "auto_filled";

   var requestBody = Utilities.newBlob("--"+boundary+"\r\n"+

  "Content-Disposition: form-data; name=\"api_key\"\r\n\r\n"+phaxio_key+"\r\n"+
  "--"+boundary+"\r\n"+

  "Content-Disposition: form-data; name=\"api_secret\"\r\n\r\n"+phaxio_secret+"\r\n"+
  "--"+boundary+"\r\n"+

  "Content-Disposition: form-data; name=\"to\"\r\n\r\n"+the_phone+"\r\n"+
  "--"+boundary+"\r\n"+      

  "Content-Disposition: form-data; name=\"filename\"; filename=\""+the_filename+"\"\r\n"+
  "Content-Type: "+"application/pdf"+"\r\n\r\n").getBytes();
  requestBody = requestBody.concat(the_file.getBytes());
  requestBody = requestBody.concat(Utilities.newBlob("\r\n--"+boundary+"--\r\n").getBytes());

  var options =
  {
    method: "post",
    contentType: "multipart/form-data; boundary="+boundary,
    payload: requestBody
  };

 //   Logger.log("B: "+JSON.stringify(options));

  var response = UrlFetchApp.fetch(url_endpoint, options);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14655600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档