将 multer diskStorage 与 Typescript 一起使用

Using multer diskStorage with Typescript

我正在将 node.js 服务器翻译成打字稿。

我的节点功能是:

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        const dir = './uploads/';
        mkdirp(dir, err => cb(err, dir));
    },
    filename: function (req, file, cb) {
        cb(null, file.originalname)
    }
});

const upload = multer({
    storage: storage
});

router.post('/test', upload.fields({name: 'image'}), async function (req, res, next) {
...
});

但是我有很多错误。例如,我不能将文件参数设置为 Express.File 类型,'memoryStorage' 不接受参数或 mkdirp 告诉我这是不可调用的。

它有效,但我不得不使用任何 :S

const storage = multer.diskStorage({
    destination: function (req: request, _file: any, cb: any) {
        const dir = './uploads/';
        mkdirp(dir, (err: NodeJS.ErrnoException) => {
            cb(err, dir)
        });
    },
    filename: function (_req: request, file: any, cb: any) {
        cb(null, file.originalname)
    }
});

const upload = multer({
    storage: storage
});

我使用了以下代码并且有效

   const guidGenerator = require('uuid/v1');

   // configurates how the files are gonna be stored
   const storage = multer.diskStorage({
       destination: function (req: Express.Request, file: Express.Multer.File, callback: (error: Error | null, destination: string) => void) {
        callback(null, './upload/');
    },
    filename: function (req: Request, file: Express.Multer.File, callback: (error: Error | null, filename: string) => void) {
        const guid = guidGenerator();
        callback(null, guid + '_' + file.originalname);
    }
});

在我的例子中,我使用了这个。

const guidGenerator = require('uuid/v1');

const storage = multer.diskStorage({
  destination: (req, file, callback) => {
    callback(null, path.resolve('./upload/'))
  },
  filename: (req, file, callback) => {
    const guid = guidGenerator();
    callback(null, `${guid}-${file.originalname}`);
  }
});

下面是我如何使用 @types/multer 中的类型定义来实现的。

如果您还没有安装 multer 包的类型定义:

npm i --save-dev @types/multer

导入和 type 别名

import { Request } from 'express'
import multer, { FileFilterCallback } from 'multer'

type DestinationCallback = (error: Error | null, destination: string) => void
type FileNameCallback = (error: Error | null, filename: string) => void

对于storage

export const fileStorage = multer.diskStorage({
    destination: (
        request: Request,
        file: Express.Multer.File,
        callback: DestinationCallback
    ): void => {
        // ...Do your stuff here.
    },

    filename: (
        req: Request, 
        file: Express.Multer.File, 
        callback: FileNameCallback
    ): void => {
        // ...Do your stuff here.
    }
})

对于fileFilter

export const fileFilter = (
    request: Request,
    file: Express.Multer.File,
    callback: FileFilterCallback
): void => {
    if (
        file.mimetype === 'image/png' ||
        file.mimetype === 'image/jpg' ||
        file.mimetype === 'image/jpeg'
    ) {
        callback(null, true)
    } else {
        callback(null, false)
    }
}

为了更简洁的代码和关注点分离,将上述两个常量放在单独的文件中,如 config/multer.tsutil/multer.ts

用法

app.tsserver.ts中导入并使用上述常量:

app.use(multer({ storage: fileStorage, fileFilter: fileFilter })