Node.js ve ekspres [kapalı] kullanarak resimler nasıl yüklenir, görüntülenir ve kaydedilir?


110

Localhost'u yenilediğimde kaybetmemek için bir resim yüklemem, görüntülemem ve kaydetmem gerekiyor. Bu, bir dosya seçimi isteyen "Yükle" düğmesi kullanılarak yapılmalıdır.

Node.js kullanıyorum ve sunucu tarafı kodu için ifade ediyorum.


4
FAQBurada ne tür soruların sorulması gerektiğini öğrenmek için sayfasına bir göz atın . Her neyse, soruna bu sefer cevap vereceğim.
fardjad

103 kullanıcı bu sorunun belirsiz, belirsiz, eksik, aşırı geniş veya retorik olduğunu düşünmüyor. İlginç. ;)
Andreas

Yanıtlar:


251

Öncelikle, bir dosya giriş öğesi içeren bir HTML formu yapmalısınız . Ayrıca formun enctype özniteliğini multipart / form-data olarak ayarlamanız gerekir :

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

Formun, komut dosyanızın bulunduğu yere göre public adlı bir dizinde depolanan index.html'de tanımlandığını varsayarak, bu şekilde sunabilirsiniz:

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")));

Bu yapıldıktan sonra, kullanıcılar bu form aracılığıyla sunucunuza dosya yükleyebilecekler. Ancak yüklenen dosyayı uygulamanızda yeniden birleştirmek için istek gövdesini ayrıştırmanız gerekir (çok parçalı form verileri olarak).

In Express 3.x kullanabilirdin express.bodyParserçok parçalı formları işlemek için ara katman ancak itibariyle Express 4.x , çerçeve ile birlikte hiçbir vücut ayrıştırıcı var. Neyse ki, mevcut çok parçalı / form veri ayrıştırıcılarından birini seçebilirsiniz . Burada multer kullanacağım :

Form gönderilerini işlemek için bir yol tanımlamanız gerekir:

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!");
      });
    }
  }
);

Yukarıdaki örnekte, / upload konumuna gönderilen .png dosyaları , komut dosyasının bulunduğu yere göre yüklenen dizine kaydedilir .

Yüklenen resmi göstermek için, bir img öğesi içeren bir HTML sayfanız olduğunu varsayarak :

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

ekspres uygulamanızda başka bir rota tanımlayabilir res.sendFileve depolanan görüntüyü sunmak için kullanabilirsiniz :

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

101
Beyefendi ve
bilginsiniz

9
'Req.files' veya 'req.body'ye erişmek isteyenler için, body-parser artık yalnızca JSON'u yönetiyor
Scott Meyers

5
"app.use (express.bodyParser ({uploadDir: '...'}));" olarak artık çalışmıyor biri "app.use (bodyParser ({uploadDir: '...'}));" kullanmalıdır. bunun için body-parser npm aracılığıyla eklenmeli ve onu kullandığınız dosyaya "var bodyParser = require ('body-parser');" aracılığıyla eklenmelidir;
Niklas Zantner

4
bunu ekspres 4'te nasıl yapabiliriz?
Muhammed Shahzad

4
@fardjad Ya arada köşeli olursam?
Gaurav51289
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.