Як завантажувати, відображати та зберігати зображення за допомогою node.js та express [закрито]


104

Мені потрібно завантажити зображення та показати його, а також зберегти, щоб я не втратив його, коли оновлюю localhost. Це потрібно зробити за допомогою кнопки "Завантажити", яка пропонує вибрати файл.

Я використовую node.js і express для коду на стороні сервера.


4
Погляньте на, FAQщоб дізнатись, які запитання тут потрібно задавати. У будь-якому разі, цього разу я відповім на ваше запитання.
fardjad,

103 користувачі не вважають, що це питання є двозначним, розмитим, неповним, надто широким або риторичним. Цікаво. ;)
Андреас

Відповіді:


228

Перш за все, ви повинні створити HTML-форму, що містить елемент введення файлу . Вам також потрібно встановити атрибут форми enctype у multipart / form-data :

<form method="post" enctype="multipart/form-data" action="/upload">
    <input type="file" name="file">
    <input type="submit" value="Submit">
</form>

Припускаючи, що форма визначена в index.html, що зберігається в каталозі з іменем public щодо місця розташування вашого сценарію, ви можете подати його таким чином:

const http = require("http");
const path = require("path");
const fs = require("fs");

const express = require("express");

const app = express();
const httpServer = http.createServer(app);

const PORT = process.env.PORT || 3000;

httpServer.listen(PORT, () => {
  console.log(`Server is listening on port ${PORT}`);
});

// put the HTML file containing your form in a directory named "public" (relative to where this script is located)
app.get("/", express.static(path.join(__dirname, "./public")));

Після цього користувачі зможуть завантажувати файли на ваш сервер за допомогою цієї форми. Але щоб зібрати завантажений файл у своїй програмі, вам потрібно проаналізувати тіло запиту (як багаточастинні дані форми).

У Express 3.x ви можете використовувати express.bodyParserпроміжне програмне забезпечення для обробки багаточастинних форм, але, як і в Express 4.x , в рамках фреймворку немає парсера. На щастя, ви можете вибрати один із багатьох доступних синтаксичних синтаксичних аналізаторів / даних форми . Тут я буду використовувати мультер :

Вам потрібно визначити маршрут для обробки повідомлень у формі:

const multer = require("multer");

const handleError = (err, res) => {
  res
    .status(500)
    .contentType("text/plain")
    .end("Oops! Something went wrong!");
};

const upload = multer({
  dest: "/path/to/temporary/directory/to/store/uploaded/files"
  // you might also want to set some limits: https://github.com/expressjs/multer#limits
});


app.post(
  "/upload",
  upload.single("file" /* name attribute of <file> element in your form */),
  (req, res) => {
    const tempPath = req.file.path;
    const targetPath = path.join(__dirname, "./uploads/image.png");

    if (path.extname(req.file.originalname).toLowerCase() === ".png") {
      fs.rename(tempPath, targetPath, err => {
        if (err) return handleError(err, res);

        res
          .status(200)
          .contentType("text/plain")
          .end("File uploaded!");
      });
    } else {
      fs.unlink(tempPath, err => {
        if (err) return handleError(err, res);

        res
          .status(403)
          .contentType("text/plain")
          .end("Only .png files are allowed!");
      });
    }
  }
);

У наведеному вище прикладі файли .png, розміщені в / upload, будуть збережені у завантаженому каталозі щодо місця розташування сценарію.

Щоб показати завантажене зображення, припустимо, що у вас вже є HTML-сторінка, що містить елемент img :

<img src="/image.png" />

Ви можете визначити інший маршрут у своєму експрес-додатку та використовувати його res.sendFileдля обслуговування збереженого зображення:

app.get("/image.png", (req, res) => {
  res.sendFile(path.join(__dirname, "./uploads/image.png"));
});

92
Ви, сер, джентльмен і вчений
mattdlockyer

9
Для тих, хто хоче отримати доступ до "req.files" або "req.body", парсер тіла тепер обробляє лише JSON, перевірте github.com/expressjs/multer
Скотт Мейерс

5
як "app.use (express.bodyParser ({uploadDir: '...'})));" вже не працює, слід використовувати "app.use (bodyParser ({uploadDir: '...'})));". для цього парсер тіла повинен бути доданий за допомогою npm та доданий до файлу, у якому ви його використовуєте, за допомогою "var bodyParser = require ('body-parser');"
Ніклас Зантнер,

4
як ми можемо це зробити в express 4?
Мухаммед Шахзад

4
@fardjad Що робити, якщо я маю кутовий між ними?
Gaurav51289
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.