Box: ファイルアップロード

Box: ファイルアップロード (Box: Upload File)
Box の指定フォルダにファイルをアップロードします。
2019-06-26 (C) Questetra, Inc. (MIT License)
Configs
  • C1: OAuth2 設定名 *
  • C2: アップロードするファイルが保存されているファイル型データ項目 *
  • C3: ファイルをアップロードするフォルダの ID (指定がない場合は、ルートフォルダ) #{EL}
  • C4: ファイル ID を保存する文字型データ項目
  • C5: ファイル URL を保存する文字型データ項目
Script
// Upload to box via boxAPI (ver. 20161018)
// (c) 2016, Questetra, Inc. (the MIT License)

// OAuth2 config
// Authorization Endpoint URL: https://app.box.com/api/oauth2/authorize
// Token Endpoint URL: https://app.box.com/api/oauth2/token
// Scope:
// Consumer Key: (Get by box Application on box Developers)
// Consumer Secret: (Get by box Application on box Developers)

main();
function main(){
  //// == 工程コンフィグの参照 / Config Retrieving ==
  const oauth2 = configs.get( "conf_OAuth2" );
  const fileDataNumber = configs.get( "uploadedFile" ); // (returns Number)
  const idDataNumber = configs.get( "fileId" );
  const urlDataNumber = configs.get( "fileUrl" );
  //// == ワークフローデータの参照 / Data Retrieving ==
  let folderId = configs.get( "uploadedFolderId");
  if(folderId == "" || folderId == null){
    folderId = "0";
  }
  const files = engine.findDataByNumber( fileDataNumber );
  //// == 演算 / Calculating ==
  //let accessLog = "";
  let responseJson = "";
  let uploadedFileId = "";
  let uploadedFileUrl = "";
  const token = httpClient.getOAuth2Token( oauth2 );
  if (files !== null) {
    for (let i=0; i< files.size(); i++) {
      const file = files.get(i);
      let attributes = {
        //parent : '0'
        parent : {id : folderId}
      };
      attributes["name"] = String(file.getName());
      let response = httpClient.begin()
        .bearer(token)
        .multipart('attributes', JSON.stringify(attributes))
        .multipart('file', file)
        .post('https://upload.box.com/api/2.0/files/content');
      responseJson += response.getResponseAsString() + "\n";
      //when error thrown
      if (response.getStatusCode() !== 201) {
        if (response.getStatusCode() === 409) {
          throw "failed to upload: " + file.getName() + "\n status:" + response.getStatusCode() +"\n" + responseJson + "\n Same name file already exists.";
        }else{
          throw "failed to upload: " + file.getName() + "\n status:" + response.getStatusCode() + "\n" + responseJson;
        }
      }
      engine.log("---POST request--- " + response.getStatusCode() + "\n" + file.getName() + "\n" + responseJson + "\n");
      let json = JSON.parse(response.getResponseAsString());
      if(uploadedFileId !== ""){
        uploadedFileId += "\n";
      }
      if(uploadedFileUrl !== ""){
        uploadedFileUrl += "\n";
      }
      uploadedFileId += json.entries[0].id;
      uploadedFileUrl += "https://app.box.com/file/" + json.entries[0].id;
      responseJson = "";
    }
  }

  // for Debug
  //accessLog += responseJson + "\n";

  //// == ワークフローデータへの代入 / Data Updating ==
  if(idDataNumber !== "" && idDataNumber !==  null){
    const idDataDef = engine.findDataDefinitionByNumber(idDataNumber);
    //Multiple Judge
    if(idDataDef.matchDataType("STRING_TEXTFIELD") && files.size() > 1){
      throw "Multiple files are uploaded.Can't set data to single-line string Data Item."
    }
    engine.setDataByNumber(idDataNumber,uploadedFileId);
  }
  if(urlDataNumber !== "" && urlDataNumber !==  null){
    const urlDataDef = engine.findDataDefinitionByNumber(urlDataNumber);
    //Multiple Judge
    if(urlDataDef.matchDataType("STRING_TEXTFIELD") && files.size() > 1){
      throw "Multiple files are uploaded.Can't set data to single-line string Data Item."
    }
    engine.setDataByNumber(urlDataNumber,uploadedFileUrl);
  }
}

Download

Capture

Notes

  1. フォルダ ID は、URL に含まれています。 https://{sub-domain}.app.box.com/folder/(Folder ID)
  2. ファイル名が競合(コンフリクト)する場合はエラーとなります
  3. Box のリフレッシュトークンには、期限があります。期限を超えないよう、定期的に利用する必要があります。(2019 年 7 月時点で、60日。 https://box-content.readme.io/docs/oauth-20)
%d人のブロガーが「いいね」をつけました。