我正在尝试为一个third-party service从多个文档创建一个UrlFetchApp()有效负载。如果我效仿他们对多个内联文档的示例,UrlFetchApp()有效负载应该同时包含二进制文件(用于每个文件)和文本(用于分隔两段内容)。如何将此混合内容提供给payload高级参数?
我已经成功地使用.getBytes()对blob执行了二进制操作,如下所示:
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());
}发布于 2013-02-02 20:49:51
你已经得到了你需要的大部分代码,你只需要对它重新安排一下,并内置多部分处理。
我建议您修改您的传真发送函数,以处理一组文件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);
}这样,您就可以根据文件数组的length来设置contentType。如果是单个文件,则使用contentType=fileBlob.getContentType(),否则使用适当的boundary参数执行contentType=multipart/mixed...。
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标记。跟随by...files[i].getBytes()的files[i].getContentType()
然后,通过以下方式最终确定多部分有效负载:
boundary字符串,表示结束。现有函数的最后一部分保持原样,使用上面构造的payload设置options,并使用fetch()发送它。您现在应该有了一个可以处理单个或多个传真的函数。
发布于 2013-12-14 01:27:38
下面是一个发布带有文本参数的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);https://stackoverflow.com/questions/14655600
复制相似问题