2

我正在尝试从多个文档为第三方服务创建UrlFetchApp()有效负载。如果我按照他们的示例处理多个内联文档,则 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());
}
4

2 回答 2

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+'"';
  }

您可以选择使用这样的硬编码边界 - 有趣的是,此示例中的边界在搜索中出现的频率。如果您可以生成自己的随机字符串,那就更好了。这一切都在RFC2046 的第 5.1 节,多用途 Internet 邮件扩展中进行了描述。

设置好contentType后,构建消息的有效负载。如果是单个文件,则payload仅包含files[0].getBytes(). 否则,循环遍历files,附加到payload每个。

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

  • 一个空行 (CRLF),后跟..
  • 以双连字符开头的boundary字符串,后跟...
  • 文件的content-type标签。files[i].getContentType(), 其次是...
  • files[i].getBytes()

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

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

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

于 2013-02-02T12:49:50.830 回答
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);
于 2013-12-13T17:27:37.630 回答