2

サードパーティサービスの複数のドキュメントからUrlFetchApp()ペイロードを作成しようとしています。複数のインラインドキュメントの例に従う場合、UrlFetchApp()ペイロードには、バイナリ(ファイルごと)とテキスト(2つのコンテンツを分離するため)の両方が含まれている必要があります。この混合コンテンツをペイロードの高度な引数に提供するにはどうすればよいですか?

次のように、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を処理するように、FAX送信機能を変更することをお勧めします。テスト関数のコードは次のようになります。配列を作成して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で説明されています。

設定したらcontentType、メッセージのペイロードを作成します。単一のファイルの場合、は。payloadのみで構成されますfiles[0].getBytes()。それ以外の場合は、ループしてfiles、それぞれに追加しpayloadます。

各ファイルのマルチパートペイロードは、次のもので構成されます。

  • 空白行(CRLF)の後に..
  • boundaryダブルハイフンが前に付いた文字列の後に...
  • content-typeファイルのタグ。files[i].getContentType()、 に続く...
  • files[i].getBytes()

次に、マルチパートペイロードは次のように確定されます。

  • 空白行(CRLF)の後に...
  • 文字列はboundary前後をダブルハイフンで囲み、終わりを示します。

既存の関数の最後の部分はそのままで、上で作成したを使用して設定しoptions、それを送信するために使用します。これで、1つまたは複数のFAXを処理できる関数ができました。payloadfetch()

于 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 に答える