multerで受けたファイル名が ã でデコードされない

環境

環境:Ubuntu 22.xx
Node:v16.19.0
multer:1.4.5-lts.1

何が起きたのか!

日本語ファイルをアップロードすると、ファイル名に”ã”の文字が挟まりデコードされずにurlエンコードされたままとなる。
・”PDFこれなに.pdf”

・””PDFã\u0081\u0093ã\u0082\u008Cã\u0081ªã\u0081«.pdf”

キーワードとして”ã decodeできない”で検索したところ、下記のページに出会いました。
ãだらけの文字化けはなぜ起こるか

全部は理解できていないんですが(^^; UTF-8にデコードしましょう!とのことだったんで、iconv-lite使って対処いました。

やったこと

・multer部分

const storage = multer.diskStorage({
  // ファイルの保存先を指定
  destination: function (req, file, cb) {
    cb( null, 'upload/document/' );
  },
  // ファイル名を指定(オリジナルのファイル名を指定)
  filename: function (req, file, cb) {
    iconv.skipDecodeWarning = true; // Iconv-lite warning: decode()-ingをスルーする
     // https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding
    const cnsDecodeFileName = iconv.decode( file.originalname, 'utf-8' );
    cb( null, cnsDecodeFileName );
  }
})
const upload = multer({ storage: storage })

・こんな感じになりました。

[
  {
    fieldname: 'target',
    originalname: 'PDFã\x81\x93ã\x82\x8Cã\x81ªã\x81«.pdf',
    encoding: '7bit',
    mimetype: 'application/pdf',
    destination: 'upload/document/',
    filename: 'PDFこれなに.pdf',
    path: 'upload/document/PDFこれなに.pdf',
    size: 7767
  }
]

終わりに

しかし、別のサーバーでは上記の対応が不要でした。
この違いは何なんだろうか。。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA