2013-02-01 2 views
2

third-party service에 대한 여러 문서에서 UrlFetchApp() 페이로드를 생성하려고합니다. 여러 개의 인라인 문서에 대한 예제를 따르면 UrlFetchApp() 페이로드에는 각 파일에 대한 바이너리와 두 개의 내용을 구분하는 텍스트가 모두 포함되어야합니다. 이 혼합 된 내용을 페이로드 고급 인수에 어떻게 제공합니까?바이너리 및 텍스트 페이로드가 혼합 된 Google Apps Script 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

, 당신은 단지 그것을 조금을 다시 준비 할 필요가 다중 부품 처리를 구축 할 수 있습니다.

팩스 전송 기능을 수정하여 일련의 파일 모양을 처리하는 것이 좋습니다. 다음은 테스트 함수의 코드가 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()을 가져오고 그렇지 않은 경우 매개 변수가있는 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이 설정되면 메시지의 페이로드를 작성하십시오. 단일 파일 인 경우 payloadfiles[0].getBytes()으로 구성됩니다. 그렇지 않은 경우 files을 반복하고 각각에 대해 payload에 추가합니다.

각 파일에 대한 다중 페이로드로 구성됩니다 : 다음에

  • 빈 줄 (CRLF) ..는
  • 이중 하이픈 앞에두고 붙여 boundary 문자열, ...
  • 다음
  • 파일의 content-type 태그
  • ...이어서

    • 빈 라인 (CRLF)을 boundary 문자열 밀폐 : files[i].getContentType()
    • files[i].getBytes()

    멀티 파트 페이로드는 다음으로 마무리 하였다 ... 전면과 후면에는 이중 하이픈이 표시되어 끝을 나타냅니다. 위에 건설 된 payload으로 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);