Muszę przesłać obraz i wyświetlić go, a także zapisać, aby nie stracić go, gdy odświeżę hosta lokalnego. Należy to zrobić za pomocą przycisku „Prześlij”, który zapyta o wybór pliku.
Używam node.js i Express dla kodu po stronie serwera.
Muszę przesłać obraz i wyświetlić go, a także zapisać, aby nie stracić go, gdy odświeżę hosta lokalnego. Należy to zrobić za pomocą przycisku „Prześlij”, który zapyta o wybór pliku.
Używam node.js i Express dla kodu po stronie serwera.
Odpowiedzi:
Przede wszystkim powinieneś stworzyć formularz HTML zawierający element wejściowy pliku . Musisz również ustawić atrybut enctype formularza na multipart / form-data :
<form method="post" enctype="multipart/form-data" action="/upload">
<input type="file" name="file">
<input type="submit" value="Submit">
</form>
Zakładając, że formularz jest zdefiniowany w index.html przechowywanym w katalogu o nazwie public w stosunku do miejsca, w którym znajduje się twój skrypt, możesz go obsługiwać w ten sposób:
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")));
Gdy to zrobisz, użytkownicy będą mogli przesyłać pliki na Twój serwer za pośrednictwem tego formularza. Jednak aby ponownie złożyć przesłany plik w aplikacji, musisz przeanalizować treść żądania (jako dane formularza wieloczęściowego).
W Express 3.x można używać express.bodyParser
oprogramowania pośredniego do obsługi formularzy wieloczęściowych, ale od Express 4.x nie ma analizatora treści dołączonego do frameworka. Na szczęście możesz wybrać jeden z wielu dostępnych parserów multipart / form-data . Tutaj użyję multera :
Musisz zdefiniować trasę do obsługi postów z formularzy:
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!");
});
}
}
);
W powyższym przykładzie, pliki .png przesłane do / upload zostaną zapisane w katalogu wgranym względem miejsca, w którym znajduje się skrypt.
Aby pokazać przesłany obraz, zakładając, że masz już stronę HTML zawierającą element img :
<img src="/image.png" />
możesz zdefiniować inną trasę w swojej aplikacji ekspresowej i użyć res.sendFile
do obsługi zapisanego obrazu:
app.get("/image.png", (req, res) => {
res.sendFile(path.join(__dirname, "./uploads/image.png"));
});
FAQ
aby dowiedzieć się, jakie pytania należy tu zadać. Tak czy inaczej, tym razem odpowiem na twoje pytanie.