我在服务器端将文件获取为console.log(body)
。
{ fieldname: 'image',
originalname: '21329726_1866651723650020_188839340_o.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: './pics/',
filename: '5146c9818ff517c426e34ad84ff3513f',
path: 'pics/5146c9818ff517c426e34ad84ff3513f',
size: 94093
}
,然后通过const base64Data = body.buffer.toString("base64")
进行编码。
但是对于小尺寸文件,它可以很好地工作,但是对于大文件,它会造成问题。它编码不正确。
我认为问题是由于在接收完整文件之前开始编码。
请给我一些正确的方法。
这是我的GitHub链接here。
答案 0 :(得分:2)
我认为最好不要在前端将pdf文件转换为base64,因为base64的大小会增加请求开销。最好使用html5 FormData上传文件和其他请求有效负载。 尝试这些更改。
直接将文件值分配给您的文档属性。
this.uploadForm.patchValue({
document: event.target.files[0]
});
//inside your service enrich your data with FormData ,set content-type to undefined and send it
uploadData (uploadForm) {
//enrich your data is FormData
let fd= new FormData();
// try looping through `this.form.controls` or uploadForm, to assign it property key and value dynamically
fd.append('branch', branch_value);
fd.append('semester', semester_value);
fd.document('document',document_value)
return this.http.post<RegisterResponse>('/user/upload', fd,set_header_config);
}
确保将内容类型正确设置为undefined。我已经测试了用angularjs上传文件,但是对最新的角度更改不太熟悉。
您可以查看以下博客: http://learnwebtechs.com/2017/04/22/angularjs-multiple-file-upload-using-http-service
答案 1 :(得分:2)
在您的/server/routes/user.js中更新此代码
const express = require('express');
const router = express.Router();
// const mongoose = require('mongoose');
const path = require('path');
const multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, __basedir + '/upload');
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
})
const upload = multer({
storage: storage,
limits: {
maxFileSize: 1024 * 1024 * 5
}
}).single('filename');
router.post('/upload', upload, (req, res) => {
res.send('uploaded');
});
router.post('/submit', (req, res) => {
console.log(req.body);
});
module.exports = router;
还要在app.js中添加以下行
global.__basedir=__dirname;