Dropbox アップロード
Dropbox の指定ディレクトリにファイルをアップロードします。同名ファイルを上書きするかどうかを指定できます。
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
- Dropbox-upload-202307.xml
- 2023-07-10 (C) Questetra, Inc. (MIT License)
(アドオン自動工程のインストールは 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
