前言
最近在做一个口语测评的小程序服务端,小程序涉及到了音频文件的上传,按理说应该统一封装一个第三方上传接口服务提供给前端调用,但是开发没有那么多道理,暂且为了省事就封装到后端服务中去了。
这篇文章需要用到前面所讲的知识点《SpringBoot开发案例之配置静态资源文件路径》,请仔细阅读如何自定义静态资源路径,最好做到服务跟文件分离。
文件上传
前端小程序代码
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', //示例,非真实的接口地址
filePath: '/static/itstyle.mp3',//默认小程序内音频路径,也可以自己上传
name: 'file',
header: {
"Content-Type": "multipart/form-data"
},
formData:
{
userId: 12 //附加信息
},
success: function (res) {
console.log(res);
},
fail: function (res) {
console.log(res);
},
complete: function (res) {
}
})
},
后端上传代码
/**
* 口语测试
* 创建者 柒
* 创建时间 2018年3月13日
*/
@Api(tags ="口语测试接口")
@RestController
@RequestMapping("/test")
public class TestController {
private final static Logger LOGGER = LoggerFactory.getLogger(WechatController.class);
@Value("${web.upload.path}")
private String uploadPath;
@ApiOperation(value="上传文件(小程序)")
@PostMapping("/fileUpload")
public String upload(HttpServletRequest request, @RequestParam("file")MultipartFile[] files){
LOGGER.info("上传测试");
//多文件上传
if(files!=null && files.length>=1) {
BufferedOutputStream bw = null;
try {
String fileName = files[0].getOriginalFilename();
//判断是否有文件(实际生产中要判断是否是音频文件)
if(StringUtils.isNoneBlank(fileName)) {
//创建输出文件对象
File outFile = new File(uploadPath + UUID.randomUUID().toString()+ FileUtil.getFileType(fileName));
//拷贝文件到输出文件对象
FileUtils.copyInputStreamToFile(files[0].getInputStream(), outFile);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(bw!=null) {bw.close();}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "success";
}
}
测试服务
小程序服务端请求必须HTTPS,如何配置,可以参考《阿里云证书服务》配置。
启动服务,执行小程序上传方法,监控前台返回参数,如果没有错误(显然没错误),查看服务器目录/home/file 下是否有相应的文件。