使用 Multer 上传文件而不使用表单标签上的 action, method, encrypt="multipart/form-data" 属性
Upload files with Multer without using action, method, encrypt="multipart/form-data" attributes on form tag
所以我正在尝试使用 Multer 上传图片,但我想使用 Angular 的 $http.post 来上传文件。没有提交按钮触发表单方法和操作。问题是,如果我不使用加密、方法或 post 属性,req.file 最终会变得未定义,并且图像不会显示在上传文件夹中。
所以我的问题是,有没有什么方法可以使用 Multer 文件上传,而不是通过带有操作的常规表单方法,而是 angular 的 $http.post()。当我现在这样做时,req.file 总是未定义的。
这是我的代码供参考
app.js(节点)
var express = require('express');
var http = require('http');
var path = require('path');
var fs = require('fs');
var crypto = require('crypto');
var multer = require('multer');
var bodyParser = require('body-parser');
var app = express();
var port = process.env.port || 8080;
app.set('view engine', 'ejs');
app.use('/assets', express.static(__dirname + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
var path = require('path');
var multer = require('multer');
var storage = multer.diskStorage({
destination: './public/uploads/',
filename: function (req, file, cb) {
crypto.pseudoRandomBytes(16, function (err, raw) {
if (err) { return cb(err); }
cb(null, raw.toString('hex') + path.extname(file.originalname));
});
}
});
var upload = multer({ storage: storage });
app.get('/', function (req, res) {
'use strict';
res.render('index', {filename: filename });
});
app.post('/', function (req, res) {
'use strict';
});
app.post('/upload', upload.single('image'), function (req, res) {
filename = req.files;
console.log(req.files);
});
app.listen(port);
HTML 表格:
<form action="/upload" method="post" encrypt="multipart/form-data">
<div class="form-group">
<label for="image">Choose Image</label>
<input id="inputImage" name="image" type="file">
<button class="form-control" ng-click="uploadFile()">Add</button>
</form>
所以我基本上想删除此默认行为并仍然获得 req.file 对象。
最后是我的 Angular 代码:
$scope.uploadFile = function(){
var file = $scope.myFile;
var uploadUrl = "/upload";
var fd = new FormData();
fd.append('file', file);
$http.post(uploadUrl,fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
console.log("success!!");
})
.error(function(){
console.log("error!!");
});
};
请帮助我...现在我得到 $http.post() .error() 回调,如果我深入研究它,那是因为 req.file 在我的节点 app.js
为什么要使用 headers: {'Content-Type': undefined}
您应该发送图像的内容类型而不是 undefined 或者删除 header 并尝试。
此外,通过使用 console.log(req.body) 您可以检查 body 您提交的内容
所以我正在尝试使用 Multer 上传图片,但我想使用 Angular 的 $http.post 来上传文件。没有提交按钮触发表单方法和操作。问题是,如果我不使用加密、方法或 post 属性,req.file 最终会变得未定义,并且图像不会显示在上传文件夹中。
所以我的问题是,有没有什么方法可以使用 Multer 文件上传,而不是通过带有操作的常规表单方法,而是 angular 的 $http.post()。当我现在这样做时,req.file 总是未定义的。
这是我的代码供参考
app.js(节点)
var express = require('express');
var http = require('http');
var path = require('path');
var fs = require('fs');
var crypto = require('crypto');
var multer = require('multer');
var bodyParser = require('body-parser');
var app = express();
var port = process.env.port || 8080;
app.set('view engine', 'ejs');
app.use('/assets', express.static(__dirname + '/public'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
var path = require('path');
var multer = require('multer');
var storage = multer.diskStorage({
destination: './public/uploads/',
filename: function (req, file, cb) {
crypto.pseudoRandomBytes(16, function (err, raw) {
if (err) { return cb(err); }
cb(null, raw.toString('hex') + path.extname(file.originalname));
});
}
});
var upload = multer({ storage: storage });
app.get('/', function (req, res) {
'use strict';
res.render('index', {filename: filename });
});
app.post('/', function (req, res) {
'use strict';
});
app.post('/upload', upload.single('image'), function (req, res) {
filename = req.files;
console.log(req.files);
});
app.listen(port);
HTML 表格:
<form action="/upload" method="post" encrypt="multipart/form-data">
<div class="form-group">
<label for="image">Choose Image</label>
<input id="inputImage" name="image" type="file">
<button class="form-control" ng-click="uploadFile()">Add</button>
</form>
所以我基本上想删除此默认行为并仍然获得 req.file 对象。
最后是我的 Angular 代码:
$scope.uploadFile = function(){
var file = $scope.myFile;
var uploadUrl = "/upload";
var fd = new FormData();
fd.append('file', file);
$http.post(uploadUrl,fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
})
.success(function(){
console.log("success!!");
})
.error(function(){
console.log("error!!");
});
};
请帮助我...现在我得到 $http.post() .error() 回调,如果我深入研究它,那是因为 req.file 在我的节点 app.js
为什么要使用 headers: {'Content-Type': undefined}
您应该发送图像的内容类型而不是 undefined 或者删除 header 并尝试。
此外,通过使用 console.log(req.body) 您可以检查 body 您提交的内容