Удалось сохранить файлы в папке, но они сохраняются без расширения файла.
Кто-нибудь знает, как я могу сохранить файл с расширением файла?
Удалось сохранить файлы в папке, но они сохраняются без расширения файла.
Кто-нибудь знает, как я могу сохранить файл с расширением файла?
В документах: "Multer не добавит вам расширение файла, ваша функция должна вернуть имя файла в комплекте с расширением файла".
Здесь вы можете добавить расширение:
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + '.jpg') //Appending .jpg
}
})
var upload = multer({ storage: storage });
Я бы рекомендовал использовать свойство mimetype
для определения расширения. Например:
filename: function (req, file, cb) {
console.log(file.mimetype); //Will return something like: image/jpeg
Дополнительная информация: https://github.com/expressjs/multer
У меня есть обходной путь для добавления правильного расширения файлов. Если вы используете модуль path
узла
var multer = require('multer');
var path = require('path')
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + path.extname(file.originalname)) //Appending extension
}
})
var upload = multer({ storage: storage });
Я получил файл с расширением file.mimetype
.
Я разделяю mimetype и получаю от него расширение файла
Попробуйте выполнить следующую функцию.
let storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads')
},
filename: function (req, file, cb) {
let extArray = file.mimetype.split("/");
let extension = extArray[extArray.length - 1];
cb(null, file.fieldname + '-' + Date.now()+ '.' +extension)
}
})
const upload = multer({ storage: storage })
В 2018 году это делается следующим образом:
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, config.DIR)
},
filename: function (req, file, cb) {
let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
cb(null, Date.now() + ext)
}
});
const upload = multer({
storage: storage
}).any();
Я использовал этот маленький трюк, чтобы получить расширение файла, и как обходной путь, чтобы обойти проблемы, которые могут возникнуть, когда кто-то дважды загружает файл с одинаковым именем файла или который существует на сервере.
const path = require('path');
const crypto = require('crypto');
let upload = multer({
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, path.join(__dirname, '../uploads'))
},
filename: (req, file, cb) => {
// randomBytes function will generate a random name
let customFileName = crypto.randomBytes(18).toString('hex')
// get file extension from original file name
let fileExtension = path.extname(file.originalname).split('.')[1];
cb(null, customFileName + '.' + fileExtension)
}
})
})
В уже ответивших кодах могут возникнуть проблемы.
upload.any()
. уязвим для злоумышленниковЯ написал приведенные ниже коды для лучшей безопасности.
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'temp/')
},
filename: function (req, file, cb) {
let ext = ''; // set default extension (if any)
if (file.originalname.split(".").length>1) // checking if there is an extension or not.
ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
cb(null, Date.now() + ext)
}
})
var upload = multer({ storage: storage });
Использование для загрузки
// using only single file object name (HTML name attribute)
// May use upload.array(["file1","file2"]) for more than one
app.post('/file_upload', upload.single("file"), function (req,res) {
//console.log(req.body, 'Body');
console.log(req.file, 'file');
res.send("cool");
})
Я так делаю
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/uploads/img/')
},
filename: function (req, file, cb) {
let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
cb(null, Date.now() + ext);
}
})
var upload = multer({ storage: storage }).single('eventimage');
Объектно-ориентированный способ хранения изображения с уникальным именем
// image.service.ts
import { diskStorage, StorageEngine } from "multer";
class ImageStorageService {
storage: StorageEngine
constructor() {
const MIME_TYPE_MAP = {
'image/png': 'png',
'image/jpeg': 'jpg',
'image/jpg': 'jpg'
}
this.storage = diskStorage({
destination: (req, file, callback) => {
const isValid = MIME_TYPE_MAP[file.mimetype]
let error = new Error('Invalid mime type')
if (isValid)
error = null
//app.use(express.static(path.join('${__dirname}/assets')))
callback(error, 'assets/images')
},
filename: (req, file, callback) => {
let currentFileName: string = file.originalname.substr(0, file.originalname.lastIndexOf('.'))
const name = currentFileName.toLowerCase().split(' ').join('-')
const ext = MIME_TYPE_MAP[file.mimetype]
callback(null, '${name}-${Date.now()}.${ext}')
}
})
}
}
export const ImageStorage = new ImageStorageService().storage
тогда в одном из ваших маршрутов
import { ImageStorage } from "./services/image-storage.service";
this.router.post('/signup', multer({ storage: ImageStorage }).single('image'), async (req, res, next) => {
let img_url: string
if (req.file) {
const url: string = '${req.protocol}:\/\/${req.get('host')}'
img_url = url + '/images/' + req.file.filename
//http://localhost:3000/images/penguins-1548339248380.jpg
}
})
dasdasdasdasdfbhasjsdf
Кто-нибудь знает, как я буду хранить файл с расширением файла?
Кто-нибудь знает, как я буду хранить файл с расширением файла?
Кто-нибудь знает, как я буду хранить файл с расширением файла?
Кто-нибудь знает, как я буду хранить файл с расширением файла?
import multer from 'multer';
import * as shortid from 'shortid';
import * as mime from 'mime-types';
const storage = multer.diskStorage({
destination: function (req,file,cb) {
cb(null, '/path/to/uploads/');
},
filename: function (req,file,cb) {
/* generates a "unique" name - not collision proof but unique enough for small sized applications */
let id = shortid.generate();
/* need to use the file mimetype because the file name may not have an extension at all */
let ext = mime.extension(file.mimetype);
cb(null, '${id}.${ext}');
}
});