Dropbox アップロード

Upload to Dropbox

Dropbox の指定ディレクトリにファイルをアップロードします。同名ファイルを上書きするかどうかを指定できます。

Auto Step icon
Configs for this Auto Step
conf_OAuth2
C1: OAuth2 設定 *
conf_Directory
C2: Dropboxディレクトリ名(例: “/aaa/bbb/”) *#{EL}
conf_uploadedFile
C3: アップロードファイルが格納されているファイル型データ *
conf_isOverWrite
C4: 既存ファイルを上書きするか
conf_fileId
C5: ファイル ID を保存する文字型データ項目 (更新)
conf_fileUrl
C6: ファイル URL を保存する文字型データ項目 (更新)
Script (click to open)

// Upload to Dropbox via DropboxAPI v2 (ver. 202307)

// OAuth2 config sample at [OAuth 2.0 Setting]
// - Authorization Endpoint URL: https://www.dropbox.com/oauth2/authorize?token_access_type=offline
// - Token Endpoint URL: https://api.dropboxapi.com/oauth2/token
// - Scope: 
// - Consumer Key: (Get by Dropbox)
// - Consumer Secret: (Get by Dropbox)

const SIZE_LIMIT = 94371840; //File size border of Questetra (90MB)

main();
function main(){

  //// == 工程コンフィグの参照 / Config Retrieving ==
  const oauth2        = configs.get( "conf_OAuth2" ) + "";
  const directory     = configs.get( "conf_Directory" ) + "";
  const isOverWrite   = configs.getObject( "conf_isOverWrite" );
  const idDataDef     = configs.getObject("conf_fileId");
  const urlDataDef    = configs.getObject("conf_fileUrl");

  //// == ワークフローデータの参照 / Data Retrieving ==
  const files = engine.findData(configs.getObject("conf_uploadedFile"));
  if (files === null) {
    engine.log("no file");
    return;
  }

  //// == 演算 / Calculating ==
  checkDirectory(directory)
  checkFile(files, idDataDef, urlDataDef);

  let uploadedFileData = [[], []]; //0:ID,1:URL

  for (let i = 0; i < files.size(); i++) {
    engine.log("upload filename:" + files.get(i).getName());
    upload(oauth2, files.get(i), directory, uploadedFileData, isOverWrite);
  }

  //// == ワークフローデータへの代入 / Data Updating ==
  setData(idDataDef, uploadedFileData[0]);
  setData(urlDataDef, uploadedFileData[1]);
}

/**
 * アップロード先のディレクトリ名のチェック
 * @param {String} directory  アップロード先ディレクトリ名
 */
function checkDirectory(directory) {
  //ディレクトリのチェック、スラッシュ始まり・スラッシュ終わりかどうか
  const regex = /^\/.*\/$/;
  if (!(regex.test(directory))) {
    throw "Invalid directory";
  }
}

/**
 * アップロードしようとするファイルの数・サイズが適切かどうかチェック
 * @param {Array<File>} files  アップロードしようとするファイルの配列
 * @param {ProcessDataDefinitionView} idDataDef  ID を保存するデータ項目の ProcessDataDefinitionView
 * @param {ProcessDataDefinitionView} urlDataDef  URL を保存するデータ項目の ProcessDataDefinitionView
 */
function checkFile(files, idDataDef, urlDataDef) {
  const fileNum = files.size(); //number of files
  if (fileNum > httpClient.getRequestingLimit()) {
    throw "Number of requests is over the limit";
  }

  //1つでもファイルサイズオーバーあったら中止
  files.forEach(file => {
    engine.log(`Uploading: ${file.getName()}`);
    if (file.getLength() > SIZE_LIMIT) {
      throw "There is a file over the size limit";
    }
  });

  checkfileNum(idDataDef, fileNum);
  checkfileNum(urlDataDef, fileNum);
}

/**
 * アップロードするファイルが複数で パス・URL 出力先のデータ項目が単一行ならエラーにする
 * @param {ProcessDataDefinitionView} dataDef  データ項目の ProcessDataDefinitionView
 * @param {Number} fileNum  アップロードしようとするファイルの個数
 */
function checkfileNum(dataDef, fileNum) {
  if (dataDef !== null) {
    //Multiple Judge
    if (dataDef.matchDataType("STRING_TEXTFIELD") && fileNum > 1) {
      throw "Multiple files are set though the Data Item to save the output is Single-line String."
    }
  }
}

/**
 * ファイルをアップロードする。一回につき一つのみ。
 * @param {String} oauth2  OAuth2 設定
 * @param {File} file  アップロードするファイル
 * @param {String} directory  アップロード先ディレクトリ名
 * @param {Array<Array<String>>} uploadedFileData  アップロードしたファイルの情報を格納する二次元配列
 * @param {Boolean} isOverWrite  同名ファイルを上書きするか
 */
function upload(oauth2, file, directory, uploadedFileData, isOverWrite) {

  const uri = "https://content.dropboxapi.com/2/files/upload";
  let json;
  if ( isOverWrite ) {
    json = '{"path": "' + directory + escaper.escapeJson(file.getName()) + '", "mode": "overwrite"}';
  } else {
    json = '{"path": "' + directory + escaper.escapeJson(file.getName()) + '"}';
  }
  //engine.log("json:"+json);

  let response = httpClient.begin()
    .authSetting( oauth2 )
    .header( "Dropbox-API-Arg", json )
    .body( file, "application/octet-stream" )
    .post( uri );
  engine.log("---POST request--- " + response.getStatusCode());
  const responseString = response.getResponseAsString();
  engine.log(responseString);

  const status = response.getStatusCode();
  if( status >= 300 ){
    engine.log("Failed to upload status:" + status);
    throw `Failed to upload\nstatus: ${status}\nfile: ${file.getName()}`;
  }
  engine.log("upload successful");
  addOutputToArray(responseString, uploadedFileData);
}

/**
 * アップロードしたデータのIDとURLを配列にセットする。
 * @param {String} responseStr  送信時のレスポンスをテキスト出力したもの
 * @param {Array<String>} uploadedFileData  アップロードしたファイルの情報が格納される配列
 */
function addOutputToArray(responseStr, uploadedFileData) {
  const json = JSON.parse(responseStr);
  uploadedFileData[0].push(json.id);
  uploadedFileData[1].push(`https://www.dropbox.com/home${json.path_display}`);
}

/**
 * アップロードしたデータのパスとURLをデータ項目に出力する。
 * @param {ProcessDataDefinitionView} dataDef  データ項目の ProcessDataDefinitionView
 * @param {Array<String>} uploadedFileData  アップロードしたファイルの情報が格納されている配列
 */
function setData(dataDef, uploadedFileData) {
  if (dataDef !== null) {
    engine.setData(dataDef, uploadedFileData.join('\n'));
  }
}

Download

warning 自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。
(アドオン自動工程のインストールは Professional editionでのみ可能です)

Notes

  • Dropbox 側のアプリケーション登録の方法
    • Dropbox developerサイト (https://www.dropbox.com/developers) にアクセスしてログイン
    • 「1. Choose an API」で「Scoped access」選択
    • 「2. Choose the type of access you need」で用途に応じて「App folder」「Full Dropbox」のどちらかを選択
    • 「3. Name your app」で名称(任意のものでOK)を入力
    • 「Create app」でアプリ作成
    • 「Settings」タブで「Redirect URIs」に「https://s.questetra.net/oauth2callback」を入力してAddする
    • 「Settings」タブで「App key」「App secret」をメモしておく(Questetra 側の設定で利用)
    • 「Permission」タブで「files.content.write」(必要な権限)をクリックしてSummitする
  • Questetra 側の HTTP 認証設定の方法
    ※参考ページ:HTTP 認証設定について理解する(https://support.questetra.com/ja/developer-blog/http-auth-setting/)
    • 「OAuth2」を選択
    • 「名前」:Dropbox(ワークフローアプリ側のアドオンXMLの「OAuth2設定」と一致していれば任意の名称でよい)
    • 「認可エンドポイントURL」:https://www.dropbox.com/oauth2/authorize?token_access_type=offline
    • 「トークンエンドポイントURL」:https://api.dropboxapi.com/oauth2/token
    • 「スコープ」:(指定なし)
    • 「クライアントID」:(Dropbox側の設定により取得したApp keyを指定)
    • 「クライアントシークレット」:(Dropbox側の設定により取得したApp secretを指定)
  • 「既存ファイルを上書きするか」を無効にした状態で、同名ファイルをアップロードしようとするとエラーが発生します。

Capture

See Also

%d