#node.js #multer
#node.js #мультер
Вопрос:
Я хочу загрузить изображения продукта с помощью Node Js. Итак, я использовал multer для загрузки изображений. Я использовал postman, чтобы проверить, работает ли он, но он возвращается Please upload a file
. Я изменил другое изображение, затем оно говорит PayloadTooLargeError: request entity too large
.
MyCode
const express = require("express");
const router = express.Router();
const multer = require('multer');
const storage = multer.diskStorage(
{
destination: function(req, file, cb)
{
cb(null, './uploads/');
},
filename: function(req, file, cb)
{
cb(null, new Date().toISOString() file.originalname);
}
});
const fileFilter = (req, file, cb) =>
{
// reject a file
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png')
{
cb(null, true);
}
else
{
cb(null, false);
}
};
const upload = multer(
{
storage: storage,
limits:
{
fileSize: 1024 * 1024 * 50
},
fileFilter: fileFilter
});
router.post("/upload", upload.single('productImage'), (req, res, next) =>
{
if (!req.file)
return res.send('Please upload a file')
var tempPath = req.file.path
console.log(tempPath);
});
package.json
{
"name": "api",
"version": "1.0.0",
"description": "testing version",
"main": "server.js",
"dependencies": {
"express": "^4.16.4",
"multer": "^1.3.0",
"nodemon": "^1.18.10",
},
"devDependencies": {},
"scripts": {
"test": "node server.js",
"start": "nodemon server.js"
},
"keywords": [
"api"
],
"author": "tteam",
"license": "ISC"
}
Комментарии:
1. Используете ли вы
body-parser
? Если это так, увеличьте лимит, как указано в github.com/expressjs/body-parser/issues/235 поможет2. Да!, я тоже использовал. Но он не находит файл, говорит
Please upload a file
3. вы хотите сохранить его в БД или в папке?
4. Оба. Изображение в папке и его имя в БД
Ответ №1:
Ваш код работает нормально, мне просто нужно изменить upload.single('productImage')
upload.single('image')
значение, и я не столкнулся с какой-либо ошибкой, например Please upload a file
, вот мое перо, оно такое же, как у вас, и работает нормально.
https://codepen.io/khanChacha/pen/rbJjYj
Please upload a file
происходит только в том случае, если вы не выбираете какой-либо файл или выбираете неправильный тип файла
Я обновил ваш код и внес несколько изменений, теперь он работает, проверьте его здесь:
Комментарии:
1. он не распознает загружаемый файл и говорит,
Please upload a file
2. Используете ли вы это
enctype="multipart/form-data"
в своей форме, чтобы показать свой html3. проверьте мой репозиторий github в моем ответе, я обновил его, теперь ваш код работает после внесения тех же изменений.
4. Хорошо, я использовал ваш код, но я получил ошибку
Error: ENOENT: no such file or directory, open 'C:UsersttestDownloadsCompresseduploads-masterapiroutesuploads2019-04-18T14:02:45.456Z55460132_25_63992_n (1).jpg'
5. Вы что-то изменили, это выглядит как ошибка из-за неправильного пути, убедитесь, что все пути правильные еще одна вещь, которую вы должны использовать
express.static
, чтобы указать статические пути или какой-либо другой модуль в node
Ответ №2:
Хранить файлы станет легко после преобразования в строку, вам просто нужно преобразовать строку в изображение в вашем интерфейсе
Преобразуйте изображение в base64
строку, используя этот код в вашем api, а также не забудьте удалить файл из папки загрузки
"img": new Buffer.from(fs.readFileSync(req.file.path)).toString("base64")
Чтобы удалить файл
let resultHandler = function (err) {
if (err) {
console.log("unlink failed", err);
} else {
console.log("file deleted");
}
}
fs.unlink(req.file.path, resultHandler);
При импорте ваших маршрутов multer
:
const multer = require('multer');
const upload = multer({ dest: __dirname '/uploads/images' });`
Добавьте upload.single(‘img’) в свой запрос:
router.post(
'/fellows-details',
authorize([Role.ADMIN, Role.USER]),
upload.single('img'),
usersController.fellowsdetails
);
Если вы не используете unlink
функцию, это вызывает ошибку, потому что она сначала сохраняет buffer
значения в папке, а затем преобразует их base64
.
Ответ №3:
Ошибка: ENOENT: нет такого файла или каталога, открыть ‘C:UsersttestDownloadsCompresseduploads-masterapiroutesuploads2019-04-18T14:02:45.456Z55460132_25_63992_n (1).jpg’
Я думаю, что проблема, похоже, связана с местоположением, в котором вы храните загруженный файл. Вам необходимо проверить наличие upload/
перед сохранением файла.
user.js
const path = require('path');
const fs = require('fs-extra');
let UPLOAD_LOCATION = path.join(__dirname, 'uploads');
fs.mkdirsSync(UPLOAD_LOCATION); //create `uploads/` folder, if it doesn't exists
Используйте это место для хранения загружаемого файла
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, UPLOAD_LOCATION);
},
filename: function (req, file, cb) {
cb(null, new Date().toISOString() file.originalname);
}
});
Для справки вы можете проверить, как настроить путь загрузки в multer