node.js - Utilizarea multer diskStorage cu Typescript
Îmi traduc un server node.js în TypeScript.
Funcția mea cu node este:
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) {
...
});
Dar am multe erori. De exemplu, nu pot seta argumentul file ca tip Express.File, 'memoryStorage' nu acceptă argumente sau mkdirp îmi spune că nu este apelabil.
Răspuns #1
Iată cum am făcut-o folosind definițiile de tipuri din @types/multer.
Dacă nu ai făcut deja acest lucru, instalează mai întâi definițiile de tip pentru pachetul multer:
npm i --save-dev @types/multer
Importuri și aliasuri 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
Pentru stocare
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.
}
})
Pentru 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)
}
}
Pentru un cod mai curat și separarea responsabilităților, plasați cele două constante de mai sus într-un fișier separat, cum ar fi config/multer.ts sau util/multer.ts
Utilizare
Importați și utilizați constantele de mai sus în app.ts sau server.ts:
app.use(multer({ storage: fileStorage, fileFilter: fileFilter })
Răspunsul #2
Am folosit următorul cod și a funcționat
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);
}
});
