プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

【Express】画像を登録するAPIを実装する

  • 2020年6月1日
  • 2020年6月13日
  • node.js
  • 1001view
  • 0件

はじめに

node.js(Expressを使用)したREST APIで、画像ファイルをアップロードする場合のサンプルを紹介します。

準備

パッケージのインストール

multerというパッケージをインストールします

npm install --save multer

https://www.npmjs.com/package/multer

実装

画像アップロードを行うrouterの上部でmulterをインポートします

const multer = require('multer')

Expressのルーティングの際にmulterのメソッドを噛ませます

 router.post('/', uploader.single('file'), (req, res) => { 

   ...

})

uploader関数の中身はこちら

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, env.UPLOADS)
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + Math.round(Math.random() * 1E9)
    name = Common.makeFileName(uniqueSuffix,file.mimetype)
    cb(null, name)
  }
})
const uploader = multer({ storage: storage })

filenameのnameの部分を指定することで任意のファイル名で保存することができます。未指定の場合はランダムな名称で保存されます。

自分の場合は別ファイルに以下のような関数を用意し、アップロード元と同じ拡張子のファイル名で保存するようにしました

makeFileName: function (name,mime){
    let mimeType = mime.split("/")
    let rename = name + "." + mimeType[1]
    return rename
}

このようにすることで、本処理(router.post(‘/’, ~)の中身で

req.file.filename

の中にリネーム後の値が入ることになりますので、上記を変数に入れ、DBに書き込むといった形になります。

呼び出し元での定義方法

axiosでの例ですが、以下のように ‘content-type’: ‘multipart/form-data’ で送信する必要があります。

    const params = new FormData();
    params.append('canReceive', this.state.user.CAN_RECEIVE);
    params.append('userName', this.state.user.USERNAME);
    params.append('file', this.state.img);
    axios.post('/', params,{
      headers: {
        'content-type': 'multipart/form-data'
      }  
    })