要在node.js中上传文件,我正在使用multer模块。代码本身在一个单独的文件中就像魅力一样。但如果我在我的项目中放置相同的代码(html代码在一个文件中并在另一个文件中路由),它就无法正常工作。
Html代码:
<form method="post" action="uploadgallerypic" enctype="multipart/form-data" >
<input type="file" name="gallerypic" />
<input type="submit" value="upload" />
</form>
相应的routes.js代码
app.use(multer({ dest: './uploads'}));
app.post('/uploadgallerypic', function(req, res) {
console.log("New photo added");
console.log(req.files);
fs.readFile(req.files.gallerypic.path, function(err, data) {
if(err) {
console.log("Error in reading pic from disk");
}
else {
fs.writeFile('newpic.jpg', data, 'binary', function(err) {
console.log("Error in writing pic to disk");
});
}
});
});
点击提交后,第一个打印到控制台的语句console.log('New photo added')
没有执行。浏览器只是旋转,最后说“没有收到数据”。但是,如果我用这两个块创建一个文件,那么它的工作正常。
var express = require('express');
var multer = require('multer');
var app = express();
var form = "<form method=\"post\" action=\"uploadgallerypic\" enctype=\"multipart/form-data\" >" +
"<input type=\"file\" name=\"gallerypic\" />" +
"<input type=\"submit\" value=\"upload\" />" +
"</form>";
app.use(multer({dest:'./uploads/'}));
app.get('/', function (req, res){
res.writeHead(200, {'Content-Type': 'text/html' });
res.end(form);
});
var fs = require('fs');
app.post('/uploadgallerypic', function(req, res) {
console.log("New photo added");
console.log(req.files);
fs.readFile(req.files.gallerypic.path, function(err, data) {
if(err) {
console.log("Error in reading pic from disk");
}
else {
fs.writeFile('newpic.jpg', data, 'binary', function(err) {
if(err) {
console.log("Error in writing pic to disk");
}
});
}
});
res.redirect('/profile');
});
app.listen(8080);
请告诉我这里缺少什么。
编辑#1
我从routes.ejs中删除了app.post('/uploadgallerypic', function(req, res)
块以查看错误“无法POST / uploadgallerypic”但我没有收到此类错误,浏览器只是旋转并且没有收到任何数据。如果我从html代码中删除enctype='multipart/form-data'
声明,那么我收到的确切错误“无法POST / uploadgallerypic”。使用enctype='multipart/form-data'
时是否有任何问题。
请帮帮我。
答案 0 :(得分:0)
我认为这可能是一个小错综复杂的错误...至少有三件事情已经被打破了#39;例如,错误/不同于您的工作&#39;示例
1)dest
值是否合适?
在您的破坏示例中,更改此行:
app.use(multer({ dest: './uploads'}));
......对此:
app.use(multer({ dest: './uploads/'}));
(请注意在dest
路径上添加了斜杠。也许并不重要,但我没有阅读multer
来源,看看是否重要。我只知道它在某些其他情况下很重要,例如在某些情况下有咕噜声。)
2)你的app.post
注意:
改变这个:
app.post('/uploadgallerypic', function(err, res) {
......对此?
app.post('/uploadgallerypic', function(req, res) {
(那里有err
的原因吗?)
3)与#2相关...
由此:
fs.readFile(req.files.gallerypic.path, function(req, data) {
......对此:
fs.readFile(req.files.gallerypic.path, function(err, data) {
(所以......你是复制代码还是手工重写代码并意外地将哪个参数交换到哪里?)
答案 1 :(得分:0)
不要直接将return
注入快递。
像这样
multer
代替
1)创建app.use(multer({ dest: './uploads/'}));
multer
2)为gallerypic创建存储(上传文件)
var Upload = multer({
storage: storage
}).any('gallerypic');
3)定义你的路线
// storage for upload file.
var storage = multer.diskStorage({
destination: function (req, file, callback) {
callback(null, './file');
},
filename: function (req, file, callback) {
callback(null, file.originalname);
}
});
4)在你的路线中调用闷闷不乐。
router.post('/uploadgallerypic', postData);
请参考:How to return id of uploaded file (upload with multer in nodejs express app)