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
}
]
終わりに
しかし、別のサーバーでは上記の対応が不要でした。
この違いは何なんだろうか。。