具有混合二进制和文本有效负载的Google Apps脚本UrlFetchApp()

时间:2013-02-01 21:48:28

标签: google-apps-script

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

我在blob上只使用.getBytes()成功完成了二进制文件,如下所示:

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());
}

2 个答案:

答案 0 :(得分:2)

您已经拥有了所需的大部分代码,您只需要重新安排一下并构建多部分处理。

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

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);
}

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

  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),然后是..
  • { - 1}}字符串前缀为双连字符,后跟...
  • 文件的boundary标记。 content-type,然后是......
  • files[i].getContentType()

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

  • 一个空白行(CRLF),然后是......
  • 前后封闭的files[i].getBytes()字符串,带有双连字符,表示结束。

现有功能的最后一部分保持原样,使用上面构建的boundary设置options,并使用payload将其发送出去。您现在应该有一个可以处理单个或多个传真的功能。

答案 1 :(得分:2)

以下是将pdf与文本参数一起发布的示例

  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);