在Loopback自定义远程方法中通过多部分表单文件处理file upload

我已经尝试了一切推荐在我怎样才能用LoopBack身体分析器? 但仍然没有运气。

我的客户端应用程序在AngularJS中,使用ng-file-upload模块,具体如下:

Upload.upload({ url: apiUrl + '/Recipes/uploadImage', file: $scope.picFile, params: { recipeId: newRecipe.id } }) .then(function(res) { console.log('succes:', res); }, function(err) { console.log('error:', err); }, function(evt) { console.log('progress:', evt); }); 

在服务器(Loopback)方面,我确定server/middleware.json已经注册了中间件:

  ... "parse": { "body-parser#json": {}, "body-parser#urlencoded": {"params": { "extended": true }} }, ... 

对于好的方法,尽pipe我不确定除了multer是否还需要body-parser(因为在middleware.json中注册了body-parser),我已经把这些行包含在server/server.js

 var bodyParser = require('body-parser'); var multer = require('multer'); app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(multer().any()); // for parsing multipart/form-data 

而且我也安装了两个:

 npm install --save multer npm install --save body-parser 

最后,我的自定义远程方法如下所示:

  Recipe.remoteMethod( 'uploadImage', { accepts: [ { arg: 'req', type: 'object', http: { source: 'req' } }, { arg: 'res', type: 'object', http: { source: 'res' } } ], returns: { arg: 'status', type: 'object', root: true }, http: {verb: 'post'} } ); 

到目前为止的实际function只是试图得到一些工作:

 Recipe.uploadImage = function (req, query, cb) { console.log('params:', req.file, req.recipeId); console.log('body:', req.body); ... // And once I can get this I'm going to get the stream and pipe it to a remote storage container, but I need the file first! 

发布到上面的输出是

 params: undefined undefined body: {} 

哪种types的build议说,multer并不是真的在做它的事情,我真的没有得到多部分forms岗位的部分?

帮帮我!

告诉我,如果这有助于你。 通过loopback3中的上传和检查信息。

/server/server.js

 var loopback = require('loopback'); var bodyParser = require('body-parser'); var multer = require('multer'); var boot = require('loopback-boot'); var app = module.exports = loopback(); app.use(bodyParser.json()); // for parsing application/json app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded app.use(multer().any()); // for parsing multipart/form-data app.start = function() { 

/server/midleware.json

  "parse": { "body-parser#json": {}, "body-parser#urlencoded": {"params": { "extended": true }} }, 

最终型号:

 module.exports = function(Offer) { Offer.add = function (ctx,options,cb) { console.log(ctx.req.body); console.log(ctx.req.files[0]); if(!options) options = {}; ctx.req.params.container = 'x'; Container.upload(ctx.req,ctx.result,{container: 'x'},function (err,fileObj) { fileObj.files[''] ... 

和远程我是不同的,那么你的

  Offer.remoteMethod( 'add', { description: 'Uploads a file', accepts: [ { arg: 'ctx', type: 'object', http: { source:'context' } }, { arg: 'options', type: 'object', http:{ source: 'query'} } ], returns: { type: 'object', root: true }, http: {verb: 'post'} } ); 

我使用邮递员发送数据资源pipe理器不允许文件。 东西探险家做一些错误。

有以下选项:地址:http: //0.0.0.0 : 3000/api/Offers/add?access_token=c6qlcG19lhEYp6C6CztcPHYKpXj2uA3qARMJU7nxBL3trjveHbxNTo0BsvV3vleO

键入:POST

authentication:不authentication

标题:空(包含默认内容types)

body:表单数据与你想发送的数据

如何configuration存储连接器以过滤文件loopback的大小和types:

  "storage": { "name": "storage", "nameConflict": "makeUnique", "connector": "loopback-component-storage", "provider": "filesystem", "root": "./server/storage", "maxFileSize": "5242880", "allowedContentTypes":["image/gif", "image/png", "image/tiff", "image/webp", "image/x-icon", "image/jpeg", "image/svg+xml", "image/x-icon"] } 

如何在环回中创build模型和文件的关系? 如何在回送中保存文件信息? 您需要在数据库中build立保存文件名称的模型。

  Container.upload(ctx.req,ctx.result,{container: 'x'},function (err,fileObj) { cFile = fileObj.files[''][0]; Image.create({ name: cFile.name, type: cFile.type, originalFilename: cFile.originalFilename, offerId: 3, container: "x"}, function (err, obj) { ...