将 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.ts
或 util/multer.ts
用法
在app.ts
或server.ts
中导入并使用上述常量:
app.use(multer({ storage: fileStorage, fileFilter: fileFilter })
我正在将 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.ts
或 util/multer.ts
用法
在app.ts
或server.ts
中导入并使用上述常量:
app.use(multer({ storage: fileStorage, fileFilter: fileFilter })