为了账号安全,请及时绑定邮箱和手机立即绑定

使用Node.js,Express和Mongoose上传图像

/ 猿问

使用Node.js,Express和Mongoose上传图像

天涯尽头无女友 2020-02-04 16:11:27

多年来,随着事情的变化,请考虑提供更多最新信息的较新答案!

由于许多新的Node.js库很快就变得过时了,无论如何我都想问一下使用以下方法上传图像的例子:

  • Node.js(v0.4.1)

  • 快递(1.0.7)

  • 猫鼬(1.1.0)。

别人如何做?

我发现:node-formidable,但是我是一般上载图像的新手,所以我想学习使用Node.js和Express的一般知识和方法。


查看完整描述

3 回答

?
扬帆大鱼

我将第一次回答我自己的问题。我从源头直接找到了一个示例。请原谅不良的缩进。我不确定在复制和粘贴时如何正确缩进。该代码直接来自GitHub上的Express multipart/form-data示例。


// Expose modules in ./support for demo purposes

require.paths.unshift(__dirname + '/../../support');


/**

 * Module dependencies.

 */


var express = require('../../lib/express')

  , form = require('connect-form');


var app = express.createServer(

  // connect-form (http://github.com/visionmedia/connect-form)

  // middleware uses the formidable middleware to parse urlencoded

  // and multipart form data

  form({ keepExtensions: true })

);


app.get('/', function(req, res){

  res.send('<form method="post" enctype="multipart/form-data">'

    + '<p>Image: <input type="file" name="image" /></p>'

    + '<p><input type="submit" value="Upload" /></p>'

    + '</form>');

});


app.post('/', function(req, res, next){


  // connect-form adds the req.form object

  // we can (optionally) define onComplete, passing

  // the exception (if any) fields parsed, and files parsed

  req.form.complete(function(err, fields, files){

    if (err) {

      next(err);

    } else {

      console.log('\nuploaded %s to %s'

        ,  files.image.filename

        , files.image.path);

      res.redirect('back');

    }

  });


  // We can add listeners for several form

  // events such as "progress"

  req.form.on('progress', function(bytesReceived, bytesExpected){

    var percent = (bytesReceived / bytesExpected * 100) | 0;

    process.stdout.write('Uploading: %' + percent + '\r');

  });

});


app.listen(3000);

console.log('Express app started on port 3000');


查看完整回答
反对 回复 2020-02-04
?
慕村225694

由于您使用的是Express,因此只需添加bodyParser:


app.use(express.bodyParser());

那么您的路线将自动访问req.files中的上载文件:


app.post('/todo/create', function (req, res) {

    // TODO: move and rename the file using req.files.path & .name)

    res.send(console.dir(req.files));  // DEBUG: display available fields

});

如果这样命名输入控件“ todo”(在Jade中):


form(action="/todo/create", method="POST", enctype="multipart/form-data")

    input(type='file', name='todo')

    button(type='submit') New

然后,当您在“ files.todo”中获得路径和原始文件名时,已准备好上传的文件:


req.files.todo.path,以及

req.files.todo.name

其他有用的req.files属性:


大小(以字节为单位)

类型(例如“ image / png”)

lastModifiedate

_writeStream.encoding(例如“ binary”)


查看完整回答
反对 回复 2020-02-04
?
慕姐829404

瞧,您能做的最好的事情就是将映像上传到磁盘并将URL保存在MongoDB中。再次获取图像时请休息。只需指定URL,您将得到一个图像。上传代码如下。


app.post('/upload', function(req, res) {

    // Get the temporary location of the file

    var tmp_path = req.files.thumbnail.path;

    // Set where the file should actually exists - in this case it is in the "images" directory.

    target_path = '/tmp/' + req.files.thumbnail.name;

    // Move the file from the temporary location to the intended location

    fs.rename(tmp_path, target_path, function(err) {

        if (err)

            throw err;

        // Delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files.

        fs.unlink(tmp_path, function() {

            if (err)

                throw err;

            //

        });

    });

});

现在,将目标路径保存在MongoDB数据库中。


同样,在检索图像时,只需从MongoDB数据库中提取URL,然后在此方法上使用它即可。


fs.readFile(target_path, "binary", function(error, file) {

    if(error) {

        res.writeHead(500, {"Content-Type": "text/plain"});

        res.write(error + "\n");

        res.end();

    }

    else {

        res.writeHead(200, {"Content-Type": "image/png"});

        res.write(file, "binary");

    }

});


查看完整回答
反对 回复 2020-02-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信