Как загружать изображения с помощью NodeJS?

#node.js #multer

#node.js #мультер

Вопрос:

Я хочу загрузить изображения продукта с помощью Node Js. Итак, я использовал multer для загрузки изображений. Я использовал postman, чтобы проверить, работает ли он, но он возвращается Please upload a file . Я изменил другое изображение, затем оно говорит PayloadTooLargeError: request entity too large .

Невозможно обнаружить изображение

ayloadTooLarge

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 происходит только в том случае, если вы не выбираете какой-либо файл или выбираете неправильный тип файла

Я обновил ваш код и внес несколько изменений, теперь он работает, проверьте его здесь:

https://github.com/faiz1996khan/uploads

Комментарии:

1. он не распознает загружаемый файл и говорит, Please upload a file

2. Используете ли вы это enctype="multipart/form-data" в своей форме, чтобы показать свой html

3. проверьте мой репозиторий 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