node.js中的文件上传错误

时间:2014-07-04 04:39:33

标签: node.js express multer

要在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'时是否有任何问题。

请帮帮我。

2 个答案:

答案 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)