ExpressJS Multer:将图像上传到服务器

咸罗卡

我是Node.js和Express.js的新手。

我想先将图像上传到服务器(目录:uploads / spots),然后(同步)上传MongoDB中的其余表单数据。

我正在使用REST(方法发布)

app.route('/ spots')。post(users.requiresLogin,spot.create);

我正在使用Multer将映像更新到服务器,并且可以正常工作。

app.use(multer(
        { dest: './public/uploads/spots',
            onFileUploadStart: function (file) {
                var imagePath = file.path;

                gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) {
                    if (!err) {
                        gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) {
                            if (!err) {
                            }
                            else{
                                console.log('Error: '+err);
                            }

                        });
                    }
                    else{
                        console.log('Error: '+err);

                    }

                });

            }

        }));

正在运行,但是是异步的,并且在将图像上传到服务器之前,将响应返回到前端。

我的问题是如何做到这一点但要同步,以及在上传图像后如何将响应返回到前端。

谢谢!

spot.server.routes.js

'use strict';

module.exports = function(app) {
    var gm = require('gm');
    var multer  = require('multer');


    var users = require('../controllers/users.server.controller.js');
    var spots = require('../controllers/spots.server.controller.js');


    //Upload image
    app.use(multer(
        { dest: './public/uploads/spots',
            onFileUploadStart: function (file) {
                var imagePath = file.path;

                gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) {
                    if (!err) {
                        gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) {
                            if (!err) {
                            }
                            else{
                                console.log('Error: '+err);
                            }

                        });
                    }
                    else{
                        console.log('Error: '+err);

                    }

                });

            }

        }));



	// Spots Routes
	app.route('/spots')
		.get(spots.list)
		.post(users.requiresLogin, spots.create);

	app.route('/spots/:spotId')
		.get(spots.read)
		.put(users.requiresLogin, spots.update)
		.delete(users.requiresLogin, spots.hasAuthorization, spots.delete);

	// Finish by binding the Spot middleware
	app.param('spotId', spots.spotByID);
};

spot.server.controller.js(创建方法)

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
	errorHandler = require('./errors.server.controller.js'),
	Spot = mongoose.model('Spot'),
	_ = require('lodash'),
    fs = require('fs');



/**
 * Create a Spot
 */
exports.create = function(req, res) {
	var spot = new Spot(JSON.parse(req.body.spot));
	spot.user = req.user;

    if(req.files.file)
        spot.image=req.files.file.name;
    else
        spot.image='default.jpg';


	spot.save(function(err) {
		if (err) {
            fs.unlinkSync('public/uploads/spots/'+spot.image);
            fs.unlinkSync('public/uploads/spots/850x850/'+spot.image);
            fs.unlinkSync('public/uploads/spots/150x150/'+spot.image);
			return res.status(400).send({
				message: errorHandler.getErrorMessage(err)
			});
		} else {
            var socketio = req.app.get('socketio'); // tacke out socket instance from the app container
            socketio.sockets.emit('spot.created.'+spot.municipality,  {spot:spot, user:req.user});
            socketio.sockets.emit('spot.created.'+spot.province,  {spot:spot, user:req.user});
            socketio.sockets.emit('spot.created.'+spot.community,  {spot:spot, user:req.user});
            socketio.sockets.emit('spot.created.'+spot.country,  {spot:spot, user:req.user});

            res.jsonp(spot);
		}
	});


};


/**
 * Spot authorization middleware
 */
exports.hasAuthorization = function(req, res, next) {
	if (req.spot.user.id !== req.user.id) {
		return res.status(403).send('User is not authorized');
	}
	next();
};

咸罗卡

解决方案不是使用onFileUploadStart方法,而是在控制器中使用带有回调的函数。

路线

  // Spots Routes
    app.route('/spots')
    .get(spots.list)
    .post(users.requiresLogin,multer({ dest: './public/uploads/spots'}), spots.create);

控制器

exports.create = function(req, res) {

if (req.files.file)
    exports.uploadImage(req.files.file,callback);
else
    callback();


    function callback(){
        var spot = new Spot(JSON.parse(req.body.spot));
        spot.user = req.user;

        if (req.files.file)
            spot.image = req.files.file.name;
        else
            spot.image = 'default.jpg';


        spot.save(function (err) {
            if (err) {
                fs.unlink('public/uploads/spots/850x850/'+spot.image);
                fs.unlink('public/uploads/spots/150x150/'+spot.image);
                return res.status(400).send({
                    message: errorHandler.getErrorMessage(err)
                });
            } else {
                var socketio = req.app.get('socketio'); // tacke out socket instance from the app container
                socketio.sockets.emit('spot.created.' + spot.municipality, {spot: spot, user: req.user});
                socketio.sockets.emit('spot.created.' + spot.province, {spot: spot, user: req.user});
                socketio.sockets.emit('spot.created.' + spot.community, {spot: spot, user: req.user});
                socketio.sockets.emit('spot.created.' + spot.country, {spot: spot, user: req.user});


                req.spot = spot;
                Feedback.subscribeSpot(req);

                Notify.getLocalSubscriptors(spot.municipality,spot.province,spot.community,spot.country,function(subscriptions){
                    Notify.create(req,null,spot,null,null,null,subscriptions,'spots/'+spot._id,false,'SPOT_CREATED', function(){
                        res.jsonp(spot);
                    });
                });
            }
        });
    }

};


exports.uploadImage = function(file, fn){
  var imagePath = file.path;

            gm(imagePath).resize(850, 850).quality(70).noProfile().write('public/uploads/spots/850x850/'+file.name, function (err) {
                if (!err) {
                    gm(imagePath).resize(150, 150).quality(70).noProfile().write('public/uploads/spots/150x150/'+file.name, function (err) {
                        if (!err) {
                          if(fn)fn();
                        }
                        else{
                            console.log('Error: '+err);
                        }

                    });
                }
                else{
                    console.log('Error: '+err);

                }

            });

};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将图像上传到服务器

来自分类Dev

使用ExpressJS在服务器中存储图像

来自分类Dev

如何正确关闭ExpressJs服务器?

来自分类Dev

使用Express和multer将具有Java MultipartEntity的图像上传到Node.js服务器

来自分类Dev

如何在multer中指定目标以将图像上传到节点js中的远程服务器文件夹?

来自分类Dev

使用ExpressJS中的VARCHAR和服务器硬盘中的图像将图像的位置存储在数据库中

来自分类Dev

通过javascript将图像上传到服务器

来自分类Dev

将图像上传到服务器时重命名

来自分类Dev

正在将图像上传到服务器,但未显示

来自分类Dev

将图像上传到服务器不起作用

来自分类Dev

将图像从android上传到PHP服务器

来自分类Dev

无法将图像上传到服务器ios

来自分类Dev

从iOS将图像上传到PHP服务器

来自分类Dev

将压缩图像上传到PHP服务器

来自分类Dev

Flutter Dio:无法将图像上传到服务器

来自分类Dev

iOS通过ASP将图像上传到服务器

来自分类Dev

从PictureBox将图像上传到服务器

来自分类Dev

无法将图像上传到服务器ios

来自分类Dev

将压缩的图像上传到PHP服务器

来自分类Dev

将图像从android上传到PHP服务器

来自分类Dev

PHP将图像上传到服务器

来自分类Dev

从Android设备将图像上传到服务器

来自分类Dev

正在将图像上传到服务器,但未显示

来自分类Dev

将图像上传到服务器symfony2

来自分类Dev

将转换后的图像上传到服务器

来自分类Dev

将图像上传到服务器不起作用

来自分类Dev

使用AsyncTask将图像或视频上传到服务器

来自分类Dev

将调整大小的表单图像上传到服务器

来自分类Dev

无法将经过改造的图像上传到服务器

Related 相关文章

热门标签

归档