Cara mengupload, menampilkan, dan menyimpan gambar menggunakan node.js dan ekspres [closed]
104
Saya perlu mengupload gambar, dan menampilkannya, serta menyimpannya agar tidak hilang saat me-refresh localhost. Ini perlu dilakukan dengan menggunakan tombol "Unggah", yang meminta pemilihan file.
Saya menggunakan node.js dan mengekspresikan untuk kode sisi server.
Dengan asumsi formulir ditentukan dalam index.html yang disimpan dalam direktori bernama public relative ke tempat skrip Anda berada, Anda dapat menyajikannya dengan cara ini:
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")));
Setelah selesai, pengguna akan dapat mengunggah file ke server Anda melalui formulir itu. Tetapi untuk memasang kembali file yang diunggah dalam aplikasi Anda, Anda harus mengurai isi permintaan (sebagai data formulir multi bagian).
Di Express 3.x Anda dapat menggunakan express.bodyParsermiddleware untuk menangani formulir multibagian tetapi pada Express 4.x , tidak ada pengurai tubuh yang dibundel dengan kerangka kerja. Untungnya, Anda dapat memilih salah satu dari banyak parser multipart / formulir-data yang tersedia di luar sana . Di sini, saya akan menggunakan multer :
Anda perlu menentukan rute untuk menangani posting formulir:
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!");});}});
Dalam contoh di atas, file .png yang diposting ke / upload akan disimpan ke direktori yang diupload sesuai dengan lokasi skrip.
Untuk menampilkan gambar yang diunggah, dengan asumsi Anda sudah memiliki halaman HTML yang berisi elemen img :
<img src="/image.png"/>
Anda dapat menentukan rute lain di aplikasi ekspres Anda dan menggunakannya res.sendFileuntuk menyajikan gambar yang disimpan:
Bagi siapa pun yang ingin mengakses 'req.files' atau 'req.body', body-parser sekarang hanya menangani JSON, lihat github.com/expressjs/multer
Scott Meyers
5
sebagai "app.use (express.bodyParser ({uploadDir: '...'}));" tidak lagi berfungsi, seseorang harus menggunakan "app.use (bodyParser ({uploadDir: '...'}));". oleh karena itu body-parser harus ditambahkan melalui npm dan ditambahkan ke file yang Anda gunakan melalui "var bodyParser = require ('body-parser');"
Niklas Zantner
4
bagaimana kita bisa melakukan ini di express 4?
Muhammad Shahzad
4
@fardjad Bagaimana jika saya memiliki sudut di antaranya?
FAQ
untuk mengetahui jenis pertanyaan apa yang harus ditanyakan di sini. Bagaimanapun, saya akan menjawab pertanyaan Anda kali ini.Jawaban:
Pertama-tama, Anda harus membuat formulir HTML yang berisi elemen input file . Anda juga perlu menyetel atribut enctype formulir ke multipart / form-data :
Dengan asumsi formulir ditentukan dalam index.html yang disimpan dalam direktori bernama public relative ke tempat skrip Anda berada, Anda dapat menyajikannya dengan cara ini:
Setelah selesai, pengguna akan dapat mengunggah file ke server Anda melalui formulir itu. Tetapi untuk memasang kembali file yang diunggah dalam aplikasi Anda, Anda harus mengurai isi permintaan (sebagai data formulir multi bagian).
Di Express 3.x Anda dapat menggunakan
express.bodyParser
middleware untuk menangani formulir multibagian tetapi pada Express 4.x , tidak ada pengurai tubuh yang dibundel dengan kerangka kerja. Untungnya, Anda dapat memilih salah satu dari banyak parser multipart / formulir-data yang tersedia di luar sana . Di sini, saya akan menggunakan multer :Anda perlu menentukan rute untuk menangani posting formulir:
Dalam contoh di atas, file .png yang diposting ke / upload akan disimpan ke direktori yang diupload sesuai dengan lokasi skrip.
Untuk menampilkan gambar yang diunggah, dengan asumsi Anda sudah memiliki halaman HTML yang berisi elemen img :
Anda dapat menentukan rute lain di aplikasi ekspres Anda dan menggunakannya
res.sendFile
untuk menyajikan gambar yang disimpan:sumber