nodejs 是如何处理post来的图片 使其放入 /public/images 里的?

洛阳Young
  • 62

初学nodejs,用的 express。

移动端这边 是想用 okhttp 直接post图片文件上去的,nodejs有没有什么直接接收并存储的方法?

之前有尝试过Base64上传,再到nodejs解码,感觉一张不带文字的图片不应该这样,太繁琐。

回复
阅读 8.8k
6 个回答
smkuse
  • 98
✓ 已被采纳

express

form 添加这个:enctype="multipart/form-data"

input(type="file")

引用

var multiparty = require('connect-multiparty')
var multipartMiddleware = multiparty();

路由
app.post('/movie/save',multipartMiddleware,Movie.savePoster,Movie.save)



exports.savePoster = function(req, res, next) {
  var posterData = req.files.uploadPoster
  var filePath = posterData.path
  var originalFilename = posterData.originalFilename

  if (originalFilename) {
    fs.readFile(filePath, function(err, data) {
      var timestamp = Date.now()
      var type = posterData.type.split('/')[1]
      var poster = timestamp + '.' + type
      **//将文件保存到特定的目录**
      var newPath = path.join(__dirname, '../../', '/file/images/' + poster)

      fs.writeFile(newPath, data, function(err) {
        // 自定义
        req.poster = poster
        next()
      })
    })
  }
  else {
    next()
  }
}

最后可以参考:http://www.imooc.com/learn/197中关于上传海报的章节视频,这个是过期的,后面一章有升级的方法

node express 有上传插件,自动解析,你只要提供个目录就可以了很简单

使用formidable来解析上传文图片,简单明了。你在npm上看看这个模块的api就行

don4
  • 3
新手上路,请多包涵

express 用 connect-busboy 来处理图片上传的 multipart/* data

这里有示例代码demo

建议用formidable,经过我这几天的实践,formidable的API设计更为合理,便于更多的自定义操作,最重要的是支持多文件上传。
connect-busboy没有上述的优点,而且不支持multipart

 app.post('/ava',multipart(),function(req, res){
        var filename = req.files.avatar.originalFilename || path.basename(req.files.avatar.path);
        var targetPath = pathname + '/image_repository/avatar/' + filename;
        fs.createReadStream(req.files.avatar.path).pipe(fs.createWriteStream(targetPath));
        var _url = '/avatar/' + filename;
        console.log(_url);
        console.log(targetPath);
        var _name = req.session.user;
        //用module方法保存数据
        User.update({name:_name},{$set:{avatar:_url}},function(err){
            if (err) throw err;


        });
        res.json({
            codetype : 200,
            msg:{url:'http://' + req.headers.host + '/' + filename},
            url:_url
        });
        //用entity方法保存数据,效果相同
        //User.findOne({name:_name},function(err, doc){
        //    if (err) throw err;
        //    if (doc){
        //        doc.set({avatar:targetPath});
        //        doc.save();
        //    }else{
        //        console.log('no user');
        //    }
        //});
        //res.json({
        //    codetype : 200,
        //    msg:{url:'http://' + req.headers.host + '/' + filename},
        //    url:_url
        //});
        //var _img = req.files;
        // console.log(_img);
        //res.json(_img);
    });

图片从前端用formdata对象传入,用流来把图片复制到你想要的文件夹下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏