通过Loopback自定义远程方法中的多部分表单文件处理文件上载

时间:2016-05-06 09:29:35

标签: angularjs node.js express multipartform-data loopbackjs

我已经尝试了How can I use body-parser with 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);
      });

在服务器(环回)方面,我确保server/middleware.json已注册中间件:

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

为了更好的衡量,虽然我不确定除了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'}
    }
  );

到目前为止,实际的功能只是尝试使用:

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: {}

哪种情况表明multer并没有真正做到这一点,而且我并没有真正获得多部分表格的部分内容?

帮助!

1 个答案:

答案 0 :(得分:0)

告诉我,如果有帮助的话。使用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'}
    }
  );

我使用postman发送数据资源管理器不允许文件。 某些资源管理器会出错。

使用此选项: 地址:http://0.0.0.0:3000/api/Offers/add?access_token=c6qlcG19lhEYp6C6CztcPHYKpXj2uA3qARMJU7nxBL3trjveHbxNTo0BsvV3vleO

输入:POST

身份验证:无身份验证

标题:为空(包含默认内容类型)

正文:包含您要发送的数据的表单数据

如何配置存储连接器以过滤文件环回的大小和类型:

      "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"]
  }

如何在环回中为模型和文件创建关系? 如何在环回中保存文件信息? 你需要在数据库中有模型保存文件名。

        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) { ...