見出し画像

Box-node-sdkでファイルをコピーしたとき名前の変え方がわからなかった話

BoxのNode.js用SDKでファイルをコピーしようとしたときに、ちゃんとドキュメントを読み込んでいれば分かったのですが、ファイル名を変えようとして(ちょっとだけ)戸惑ったお話。

Node.jsならいつもどおりBoxのリファレンスを見ながら適当にやってもだいたい何とかなるだろ!と高を括っておりました。

これこれ!Curlのサンプルだと・・・

curl https://api.box.com/2.0/files/FILE_ID/copy \
-H "Authorization: Bearer ACCESS_TOKEN" \
-d '{"parent": {"id" : FOLDER_ID}}' \
-X POST

なるほど?Bodyにparentのidが指定されているので、つまり

curl https://api.box.com/2.0/files/FILE_ID/copy \
-H "Authorization: Bearer ACCESS_TOKEN" \
-d '{"parent": {"id" : FOLDER_ID}, "name" : "コピー後のファイル名"}' \
-X POST

みたいな感じにしてあげればよさそうですね。
そして割愛しますが、上のとおりjsonでpostしたらコピー後のファイル名が変更されていることは確認できました。

さてさて、Node.jsでやってみるわけです。まぁ楽勝ですよね。

var fileID = '11111';
var destinationFolderID = '22222';
client.files.copy(fileID, destinationFolderID)
	.then(copiedFile => {
		// ...
	});

ん?コピー後のファイル名はどこに書くの?
リファレンスのページには詳細がないのでbox-node-sdkのgithubへ向かいます。files.copyの詳細Documentへ・・・

A file can be copied to a new folder with the files.copy(fileID, newParentID, callback) method.

おや?こちらにも無い・・・いやファイル名変えられないわけないでしょう?とおもったら、一番下に書いてありました。

An optional name parameter can also be passed to rename the file on copy. This can be used to avoid a name conflict when there is already an item with the same name in the target folder.
client.files.copy('12345', '0', {name: 'Renamed file.png'}, callback);

3つ目の引数に変更後のファイル名を{name:'変更後のファイル名'}といったJSON形式で入れてあげればよいのね。こちらも3つめの引数に変更後のファイル名をJSONで記載したら問題なく変更できました。

Files.prototype.copy = function(fileID, newParentID, options, callback) {

	// @NOTE(mwiller) 2016-10-25: Shuffle arguments to maintain backward compatibility
	//  This can be removed at the v2.0 update
	if (typeof options === 'function') {
		callback = options;
		options = {};
	}

	options = options || {};

	options.parent = {
		id: newParentID
	};

	var params = {
		body: options
	};
	var apiPath = urlPath(BASE_PATH, fileID, '/copy');
	return this.client.wrapWithDefaultHandler(this.client.post)(apiPath, params, callback);
};

一応files.copyに該当するコード↑も読んでみたのですが、3つ目の引数にjsonを指定した場合、optionsは前オペランドで定義されたoptionsのオブジェクトで上書きされ、空白だとfalse扱いとなり||演算子によって後オペランドで定義された{}の空JSONが代入されるようですね。

その後id: newParentIDが追加されるので、curlで作ったbodyと同じ状態となるようです。ちゃんと書いてありましたね、、

とはいえ無事にファイルが別名でコピーできたのでよかった。めでたしめでたし。

この記事が気に入ったらサポートをしてみませんか?