我已经尝试了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并没有真正做到这一点,而且我并没有真正获得多部分表格的部分内容?
帮助!
答案 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发送数据资源管理器不允许文件。 某些资源管理器会出错。
输入: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) { ...