0

要在 node.js express 中上传文件,我正在使用 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 我app.post('/uploadgallerypic', function(req, res)从 routes.ejs 中删除了块以查看错误“无法 POST /uploadgallerypic”,但我没有收到此类错误,浏览器只是旋转并说没有收到数据。如果我enctype='multipart/form-data'从 html 代码中删除声明,那么我会收到确切的错误“无法发布 /uploadgallerypic”。使用有没有问题enctype='multipart/form-data'

请帮我。

4

2 回答 2

0

我认为这可能是轻微的错别字……“损坏”示例中至少有三件事与您的“工作”示例错误/不同。

1)dest物有所值吗?

在您损坏的示例中,更改此行:

app.use(multer({ dest: './uploads'}));

...对此:

app.use(multer({ dest: './uploads/'}));

(注意在路径上添加了斜杠dest。也许并不重要,但我没有去阅读multer源代码来查看它是否重要。我只知道在其他一些情况下它很重要,例如在某些情况下有 grunt。)

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) {

(所以...您是否复制了代码或手动重写了代码并意外交换了哪个参数?)

于 2014-07-04T04:57:25.683 回答
0

不要直接注入multerexpress。像这样

app.use(multer({ dest: './uploads/'}));

相反 1) 创建对象multer

var Upload = multer({
    storage: storage 
}).any('gallerypic');

2)为gallerypic创建存储(上传文件)

// 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);
  }
 });

3)定义你的路线

 router.post('/uploadgallerypic', postData);

4) 在你的路由中调用 multer。

function postData(req,res){
 Upload(req, res, function (error) {
    if (error) {
        res.status(400).send(error);
    }
    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');
 })
}

参考这个:如何返回上传文件的ID(在nodejs express应用程序中使用multer上传)

于 2017-08-28T17:12:03.107 回答