Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

REST APIを使用したファイル取得によるダウンロード方法について

NorihikoS
Tera Contributor

Service NowからShare PointのREST APIを使用して指定したファイルをダウンロードする方法を検討しています。
現在、Share PointのREST API「GetFileByServerRelativeUrl」を使用して、RESTエンドポイントに

「https://${site_url}/_api/web/GetFileByServerRelativeUrl('${folder}/${filename}')/$value」

と指定して使用しています。

こちらのREST APIはHTTPステータス200で正常動作して指定ファイルの取得が出来ています。


質問なのですが、こちらのREST APIをサーバースクリプト側で実行し、取得したファイルをクライアントコントローラー側でダウンロードする処理を作成しているのですが、テキスト形式ファイルを正しくダウンロードできますが、Excel形式ファイル等のバイナリで取り扱うファイルが破損した状態でのダウンロードとなってしまいます。

サーバースクリプト側のREST APIで取得したファイルをクライアントコントローラー側でダウンロードする間の変数でのデータの受け渡し中に破損していると想定していますが、対応方法がわかりません。

どなたか、わかる方がいらっしゃいましたらご教授いただけませんでしょうか?

 

【サーバースクリプト側】
  r = new sn_ws.RESTMessageV2('テスト', 'File Specification GET');

  r.setStringParameter('Authorization', input.authorization);
  r.setStringParameter('folder', input.folder);
  r.setStringParameter('filename', input.filename);
  r.setStringParameter('site_url', input.site_url);
  response = r.execute();

  responseBody = response.getBody();
  data.query = query;
  data.httpStatus = response.getStatusCode();
  data.body = responseBody;

 

【クライアントコントローラー側】
  var query = {
    authorization: c.access_token,
    folder: c.folder,
    filename: c.filename,
    site_url: c.site_url,
  };

  c.server.get(query).then(function(resp){
  c.httpStatus = resp.data.httpStatus;
  if(c.httpStatus == 200) {
    c.downloadFileWrite(resp.data.body, filename);
  }

 

// ファイル保存
c.downloadFileWrite = function(body, filename) {

  var filedata = document.createElement("a");

  document.body.appendChild(filedata);
  filedata.style = "display: none";

 

  var blob = new Blob([body], {type: "application/octet-stream"});
  url = window.URL.createObjectURL(blob);

 

  filedata.href = url;
  filedata.href.download = "aaa";
  filedata.download = filename;
  filedata.click();
  window.URL.revokeObjectURL(url);
};

1件の返信1

iwai
Giga Sage

バイナリーファイルや大きなデータはRESTMessageV2 - saveResponseBodyAsAttachmentでAttachment に保存してから、Attachmentのダウンロード リンクで ダウンロードしたほうが良いと思います。

RESTMessageV2 - saveResponseBodyAsAttachment(文字列 tableName, 文字列 recordSysId, 文字列 fileName)
返された応答本文を添付ファイルレコードとして保存するように REST メッセージを設定します。
RESTMessageV2 - スコープ対象、グローバル (servicenow.com)