环境及需求:
前端采用vue;后端采用spring,但是只用到了spring的对象注入功能,未使用spring web相关功能。前后端通信采用jsonrpc,现需要在前端选中文件(格式未知,上传到后端,后端将其存储在mongoDB中)。
背景:
spring web可以直接使用controller接受MultipartFile对象;但是jsonrpc不能直接传输文件类型,jsonrpc是轻量级通信框架,擅长传输字符串。对于文本文件,使用jsonrpc是很容易实现上传功能的,因为可以将文本文件内容读成字符串进行传输。而对于docx、pdf、mp3等文件如果强行都成String,就会是一堆乱码。因此,大致的解决思路是,不管文件类型,统统转化成二进制,再将二进制进行Base64编码成String,传输编码后的String到后台,后台按照Base64解码还原成二进制,通过二进制构造File对象即可。
文件上传:
1、前端:
<Upload:before-upload="uploadJobFile" action="#">
<Button>上传文件</Button>
</Upload>
前端采用iview的Upload控件包裹button,使得点击button会打开windows的文件选中窗口,选中文件并确定后,会执行before-upload属性绑定的uploadJobFile函数。
定义uploadJobFile函数时需要指定一个形参,选中的文件就会以Blob对象的形式传给uploadJobFile函数。
uploadJobFile: function (file) {
let reader = new FileReader();
let total = file.size;
if (total > 1024 * 1024 * 100) {
this.$Message.error("上传文件必须在100MB以内!");
return;
}
let jobSpecFileDataURL;
reader.readAsDataURL(file);
reader.onload = (() => {
fileName = file.name;
jobSpecFileDataURL = reader.result;
this.JobService.uploadJobSpecFile(fileName, jobSpecFileDataURL,
() => {
this.$Message.success("上传成功");
},