multer искажает русский язык

Рейтинг: 0Ответов: 1Опубликовано: 06.05.2023

multer искажает русский язык на express typescript введите сюда описание изображения

Вот так русский язык отображается в базе данных, но проблема заключена в multer. Нужно сделать так, чтобы name (originalname) нормально отображал русский язык. Далее прилагаю код самого multer.

import multer from 'multer'
import * as uuid from 'uuid'

const StorageFiles = multer.diskStorage({
    destination:'uploads/files',
    filename: (req, file, cb)=>{
        cb(null, `${uuid.v4()}.${file.originalname.split('.').at(-1)}`)    
    },
})

const uploadFiles = multer({
    storage: StorageFiles
}).array('files', 10)

export {uploadFiles}

Далее прилагаю код, добавления файлов в базу данных

    async create(files:any){
        const filesArray = await Promise.all(files.map(async(file:any)=>{
            const fileData = await prisma.file.create({
                data:{
                    id:file.filename,
                    name: file.originalname
                }
            })
            return fileData.id
        }))
        
        return filesArray
    }

И если нужно прилагаю код из контроллера

async createFiles(req:any, res:any, next:any){
        try {
            uploadFiles(req, res, async(err:any)=>{
                if(err){
                    next(err)
                }
                else if(req.files)
                    {
                        const userData = await taskService.create(req.files)
                        return res.send(userData)
                    }
                    else {
                        next(err)
                    }
            })
        } catch (e) {
            next(e)
        }
    }

Помогите пожалуйста ^_^

Ответы

▲ 0

Символы, которые не являются utf-8 символами, нужно закодировать. В моем случае, я записывал название файла русскими буквами, поэтому оно искажалось. Чтобы закодировать название, можно использовать метод класса Buffer:

Buffer.from(fileName, 'latin1').toString();

В случае с multer используем diskStorage:

diskStorage({
        filename(
          req: e.Request,
          file: Express.Multer.File,
          callback: (error: Error | null, filename: string) => void,
        ) {
          return Buffer.from(file.filename, 'latin1').toString();
        },
      })