【发布时间】:2018-09-01 09:22:20
【问题描述】:
所以我有一个平均堆栈应用程序。在用户的个人资料页面上,我希望他们能够上传图片。
现在,我首先在模板中选择它,然后通过组件到达我使用 formData 发出 POST 请求的服务文件。在后端,我使用 Multer 中间件来处理上传,但这里出了点问题。以下是我在后端的代码。
var multer = require('multer')
var upload = multer({ dest: '../public/uploads/' });
router.post('/uploadProfilePicture/:userId', upload.single('avatar'), function(req, res){
console.log('entered');
console.log(req.file);
console.log(req.body);
res.status(200).json({
msg: 'guuud'
})
});
我主要只是想检查我是否到达后端。控制台给了我以下错误:
POST /user/uploadProfilePicture/5aaf1b7c18f2aa3d88e3b59e 500 16.382 毫秒 - 1711
没有输入的控制台日志,其他的也没有。服务和后端之间出了点问题,但我完全不知道。
这是用于此上传的服务和其他文件。
Service.component.ts
postFile(fileToUpload: File, userId) {
const formData: FormData = new FormData();
console.log(fileToUpload);
formData.append('fileKey', fileToUpload, fileToUpload.name);
console.log(formData);
return this.http.post("http://localhost:3200/user/uploadProfilePicture/" + userId, formData)
.map(() => { return true; })
.catch((e) => this.handleError(e));
}
这里是页面+服务文件中console.logs的结果
profile.component.ts
handleFileInput(files: FileList){
this.fileToUpload = files.item(0);
this.uploadFileToActivity();
}
uploadFileToActivity() {
this.userService.postFile(this.fileToUpload, localStorage.getItem('userId')).subscribe(data => {
console.log(data)
}, error => {
console.log(error);
});
}
profile.component.html
<div class="col-md-8 col-md-offset-2 profilePicSection">
<div class="form-group">
<label for="file">Choose File</label>
<input type="file"
id="file"
(change)="handleFileInput($event.target.files)">
</div>
</div>
编辑:我的服务器控制台给我的错误:
Error: Unexpected field
at makeError (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\multer\lib\make-error.js:12:13)
at wrappedFileFilter (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\multer\index.js:40:19)
at Busboy.<anonymous> (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\multer\lib\make-middleware.js:114:7)
at Busboy.emit (events.js:159:13)
at Busboy.emit (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\busboy\lib\main.js:38:33)
at PartStream.<anonymous> (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\busboy\lib\types\multipart.js:213:13)
at PartStream.emit (events.js:159:13)
at HeaderParser.<anonymous> (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\dicer\lib\Dicer.js:51:16)
at HeaderParser.emit (events.js:159:13)
at HeaderParser._finish (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\dicer\lib\HeaderParser.js:68:8)
at SBMH.<anonymous> (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\dicer\lib\HeaderParser.js:40:12)
at SBMH.emit (events.js:159:13)
at SBMH._sbmh_feed (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\streamsearch\lib\sbmh.js:159:14)
at SBMH.push (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\streamsearch\lib\sbmh.js:56:14)
at HeaderParser.push (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\dicer\lib\HeaderParser.js:46:19)
at Dicer._oninfo (C:\Users\TijlD\Desktop\test\moviemeter\node_modules\dicer\lib\Dicer.js:197:25)
【问题讨论】:
-
您的文件可能会上传到服务器,但可能不会添加扩展名
-
var multer = require('multer'); var path = require('path') var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/') }, filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)) } }) var upload = multer({ storage: storage });
-
你应该使用上面的sn-p来上传文件
-
/user/uploadProfilePicture是路径还是/uploadProfilePicture? -
文件以
fileKey的形式附加到formData 对象,但multer 需要avatar。不确定这是否是导致 500 错误的原因。但值得一试。
标签: javascript node.js angular mean-stack