Я пытаюсь использовать multer для загрузки файла из html-формы на стороне клиента на сервер, модуль multer обрабатывает файл на стороне сервера.
Дело здесь в том, что все в порядке, потому что я получаю ответ 200 ok от сервера, но файл должен быть загружен в мою файловую систему, и я не вижу его.
Это моя html-форма
<template>
<div id="app">
<form action="http://localhost:3000/upload" method="post" enctype="multipart/form-data">
<h2>Select a file</h2>
<input name="curriculum" id="inputVal" type="file">
<button type="submit">Send</button>
</form>
</div>
</template>
мой код на стороне сервера
var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
var multer = require('multer')
var storage = multer.diskStorage({
destination: function(req,file,callback) {
callback(null, '../files');
},
filename: function(req,file,callback) {
callback(null,Date.now() + file,callback);
}
})
var upload = multer({ storage: storage }).single('curriculum');
router.post('/upload', function (req, res, next) {
upload(req,res, function(err){
if(err) {
return res.status(404).send("a error ocurred");
}
res.status(200).send("file uploaded");
});
});
module.exports = router;
ОБНОВИТЬ
Я изменил базу решений на сайте npm multer (на стороне сервера)
var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
var multer = require('multer')
var upload = multer({ dest: 'uploads/' });
router.post('/upload',upload.single('curriculum') ,function (req, res, next) {
console.log(req.files);
});
module.exports = router;
Ты за помощь!
Вы не указываете файл, который хотите загрузить. input
имя input
.
router.post('/upload', upload.single('curriculum'), function (req, res, next) {
if(err) {
console.log(err);
return res.status(404).send("a error ocurred");
}
console.log(req.file);
res.status(200).send("file uploaded");
});
Также в имени файла убедитесь, что ваш файл заканчивается расширением, например .png
или .jpeg
иначе вы увидите кучу байт-кодов, которые ничего не означают.
Вы можете либо получить точное имя файла, которое дает ваш клиент, используя file.originalname
cb(null, file.originalname)
Или вы можете добавить его явно.
callback(null, file.fieldname + '-' + Date.now() + '.png')
Возможно, вы захотите удалить третий параметр callback(null,Date.now() + file,callback)
который является callback
поскольку он может прослушивать программу, и изменить + file
на что-то вроде + file.originalname
поскольку file
является объектом и на компьютере может возникнуть проблема с объектом, связанным с именем файла.
ОБНОВИТЬ
Основные NODEJS
var express = require('express')
var multer = require('multer')
var app = express()
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, __dirname + '/uploads') //you tell where to upload the files,
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + '.png')
}
})
var upload = multer({storage: storage,
onFileUploadStart: function (file) {
console.log(file.originalname + ' is starting ...')
},
});
app.set('view engine', 'ejs');
app.get('/', function(req, res, next){
res.render('mult'); //our html document
})
app.post('/profile', upload.single('avatar'), function (req, res, next) {
// req.file is the 'avatar' file
console.log(req.file);
return false;
})
HTML-форма
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form accept="image/x-png,image/gif,image/jpeg" enctype="multipart/form-data" action="/profile" method="post">
<input type="file" name="avatar" value="">
<input type="submit" name="" value="ssss">
</form>
</body>
</html>
upload
@costacosta