1
2

Node.jsからCloudflare R2に動画ファイルをアップロードしてみるメモ

Last updated at Posted at 2024-01-29

R2に動画ファイルをアップロードしてみます。

通常はCloudflare Workers上からアップロードするのが良い

ただ重たい処理などがあるとCloudflare workers上だと処理がキャンセルされてしまうことがあります。

  • 重たいファイルを扱う場合
  • その他単純にR2を外部から使いたい

などの時はNode.jsからアップロードするという選択肢も持っておくと良さそうでした。

node-cloudflare-r2

パッと調べて出てきたこのライブラリが手軽でありがたかったです。

$ npm i node-cloudflare-r2

accountIdaccessKeyIdsecretAccessKeyの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タイプになります。

R2の管理画面上
スクリーンショット 2024-01-26 0.17.51.png

そこで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になりました。

スクリーンショット 2024-01-29 14.42.48.png

参考: application/octet-stream【MIMEタイプ】

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2