2013-02-01 55 views
2

我試圖從third-party service的多個文檔創建一個UrlFetchApp()負載。如果我按照他們的示例對多個嵌入式文檔進行操作,則UrlFetchApp()有效內容應包含二進制文件(用於每個文件)和文本(用於分隔兩段內容)。如何將這個混合內容提供給有效載荷高級參數?帶有混合二進制和文本有效負載的Google Apps腳本UrlFetchApp()

我已經成功地完成二進制只使用.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

你有你最需要已有的代碼,你只需要重新安排有點並建立在多部分處理。

我建議你修改你的傳真發送函數來處理一個文件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設置,構建消息的有效載荷。如果它是一個文件,​​只包含files[0].getBytes()。否則,循環通過files,爲每個追加​​。

每個文件的多有效載荷將包括:

  • 一個空行(CRLF),其次是..
  • boundary串用雙連字符前綴,其次是...
  • 該文件的content-type標記。 files[i].getContentType(),隨後...
  • files[i].getBytes()

多部分的有效載荷,然後通過最終確定:

  • 一個空行(CRLF),隨後...
  • boundary串括正面和背面帶有雙連字符,表示結束。

現有功能的最後部分保持原來的樣子,建立options與上面已經構建了​​,並使用fetch()來把它關閉。您現在應該具有可以處理單個或多個傳真的功能。

+0

這確實有助於拉它一起!我還在GAS文檔中發現了以下未解決的問題。任何與多部分和多類型問題鬥爭的人都可能想要爲它加註星標。 http://code.google.com/p/google-apps-script-issues/issues/detail?id=1387 –

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); 
相關問題