我正在尝试为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());
}
答案 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
。
每个文件的多部分有效负载将包括:
boundary
标记。 content-type
,然后是...... files[i].getContentType()
然后通过以下方式确定多部分有效负载:
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);