R2に動画ファイルをアップロードしてみます。
通常はCloudflare Workers上からアップロードするのが良い
ただ重たい処理などがあるとCloudflare workers上だと処理がキャンセルされてしまうことがあります。
- 重たいファイルを扱う場合
- その他単純にR2を外部から使いたい
などの時はNode.jsからアップロードするという選択肢も持っておくと良さそうでした。
node-cloudflare-r2
パッと調べて出てきたこのライブラリが手軽でありがたかったです。
$ npm i node-cloudflare-r2
accountId
、accessKeyId
、secretAccessKey
の3つのキーはCloudflare R2のページから取得できます。
https://xxxxxxxxxxxxxxxxxxxxxx.r2.dev
といった形のPublic URLも必要ですが、同じくページから確認できます。
const {R2} = require('node-cloudflare-r2');
const r2 = new R2({
accountId: '<AccountId>',
accessKeyId: '<AccessKeyId>',
secretAccessKey: '<SecretAccessKey>',
});
const bucket = r2.bucket('testbucket');
const main = async () => {
// Set your bucket's public URL
bucket.provideBucketPublicUrl('https://xxxxxxxxxxxxxxxxxxxxxx.r2.dev');
console.log(await bucket.exists());
// true
//第1引数: ローカルファイル名
//第2引数: バケット上で保存する名前
//第3引数: customMetaData
//第4引数: ファイルのMIMEタイプ
const upload = await bucket.uploadFile('./test.mp4', 'test.mp4', '', 'video/mp4');
console.log(upload);
/*
{
objectKey: 'destination_file_name.ext',
uri: 'destination_file_name.ext',
publicUrl: 'https://pub-xxxxxxxxxxxxxxxxxxxxxxxxx.r2.dev/destination_file_name.ext',
etag: '',
versionId: '',
}
*/
}
main();
MIMEタイプ指定が独特
現状のバージョン("node-cloudflare-r2": "^0.1.5"
)だとそのまま送るとapplication/octet-stream
というMIMEタイプになります。
そこでMIMEタイプを指定したいのですが、何故かKey-Valueではなく配列で送る感じになっていました。(中までは見てない...)
//第1引数: ローカルファイル名
//第2引数: バケット上で保存する名前
//第3引数: customMetaData
//第4引数: ファイルのMIMEタイプ
const upload = await bucket.uploadFile('./test.mp4', 'test.mp4', '', 'video/mp4');
こんな感じで第四引数がMIMEタイプです。今回動画をアップロードしたかったのでここにvideo/mp4を指定します。
こんな形でアップロードするとちゃんとMIMEタイプがvideo/mp4になりました。