NodeJSでimgurに動画を匿名アップロードする

公開:2021/02/18
更新:2021/02/18
1 min読了の目安(約1200字IDEAアイデア記事

フロント側からmultipart/form-dataで動画ファイルを受け取り、
node-fetchでimgur APIを叩いて匿名アップロードする処理です。

multer使うところとかFormData周り結構ハマったので備忘録。

import * as express from "express";
import fetch from "node-fetch";
import * as FormData from 'form-data';

interface MulterFile {
  key: string;
  path: string;
  mimetype: string;
  originalname: string;
  size: number;
  buffer: Buffer;
}
const multer = require("multer");
const upload = multer();

~~~
(中略)
this.router.post("/", upload.any(), this.post);
~~~
private async post(
    req: express.Request & { files: MulterFile[] },
    res: express.Response
  ) {
    let formData = new FormData();
    formData.append('video',req.files[0].buffer,req.files[0].originalname);
    const requestOptions = {
        method: "POST",
        headers: {
            "Content-Type": "multipart/form-data",
        },
        body: formData,
    };
    delete requestOptions.headers['Content-Type'];
    const response = await fetch(
        "https://api.imgur.com/3/upload",
        requestOptions
    );
    const result = await response.json();

resultにdeletehashや動画の掲載先が返ってくるのでDBなどに保存する。

あとはexpressやnginxのアップロードファイルサイズ上限の設定を忘れないようにしましょう。
特にnginxはCORS許可しているのにファイルサイズ上限が設定されていなかったためにCORSエラーを返してくるので注意しましょう。