首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Node.js、Express和Mongoose上传图像

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

Stack Overflow用户
提问于 2011-03-01 09:25:25
回答 13查看 130.8K关注 0票数 103

请考虑包含更多最新信息的更新答案,因为这些年来情况发生了变化!

由于许多新的Node.js库很快就被淘汰了,而且相对较少的示例,我想问一下如何使用以下工具上传图像:

  • Node.js Node.js

(1.1.0)。

其他人是怎么做到的?

我已经找到了:node-formidable,但我对上传图片还是个新手,所以我想学习一些通用的东西,以及使用Node.js和Express上传图片的方法。

EN

回答 13

Stack Overflow用户

发布于 2011-03-01 09:35:51

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

代码语言:javascript
复制
// 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');
票数 74
EN

Stack Overflow用户

发布于 2012-03-21 05:42:29

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

代码语言:javascript
复制
app.use(express.bodyParser());

然后,您的路由将自动访问req.files中上载的文件:

代码语言:javascript
复制
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中):

代码语言:javascript
复制
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,and
  • req.files.todo.name

其他有用的req.files属性:

二进制大小(以字节为单位)

  • 类型(例如,'image/png')

  • lastModifiedate

  • _writeStream.encoding (例如,‘

  • ’)
票数 46
EN

Stack Overflow用户

发布于 2012-05-15 20:46:20

您可以在主应用程序文件的配置块中配置connect body解析器中间件:

代码语言:javascript
复制
    /** Form Handling */
    app.use(express.bodyParser({
        uploadDir: '/tmp/uploads',
        keepExtensions: true
    }))
    app.use(express.limit('5mb'));
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5149545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档