Spring Boot的文件上传并不需要单独进行。当前端进行请求时,所要上传的文件作为请求的一个参数即可,与其他类型参数相同。服务端接收时,只需要对这个文件参数使用MultipartFile类型接收即可。
由于文件上传的参数无法直接拼接到URL中,所以只能是post请求。
如图,用postman来测试,使用post请求,在body中共传入3个参数:
- photo:图片文件。类型为File,Value选择本地的文件。
- param0:字符串。
- param1:字符串。
对于服务端,接收前端传入的这3个参数:
@RequestMapping(value = "/upload")
public Boolean upload(@RequestParam("photo") MultipartFile file, @RequestParam("param0") String param0, @RequestParam("param1") String param1) {
if (file == null) return false;
try{
String basePath = "D:/save/";
FileInputStream fileInputStream = (FileInputStream) (file.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(basePath + file.getOriginalFilename()));
byte[] bs = new byte[1024];
int len;
while ((len = fileInputStream.read(bs)) != -1) {
bos.write(bs, 0, len);
}
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
如上,使用MultipartFile接收文件,使用两个String来接收param0和param1。
然后操作File保存到本地即可。
通常的文件处理思路是:将文件保存在本地,其基础路径保存在配置文件中,同时要在tomcat中对该路径进行映射。然后将扩展路径和文件名保存在数据库中。当前端进行请求时,从数据库中取出扩展路径信息,发送给前端。前端将扩展路径与项目路径进行拼装来访问。
例如,服务端的地址为192.168.x.xx:8030,工程名为Template,图片的保存路径是D:/test/文件夹:
1.在Spring Boot中配置basePath:
basePath = D:/test/
2.打开Tomcat的server.xml,在<Host>标签下添加一个<Context>标签用于映射:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context debug="0" docBase="D:/test" path="/Template/photo" reloadable="true"/>
...
</Host>
其作用是将docBase映射到path。这样,当访问Tomcat的path下的文件时,Tomcat就会去docBase下寻找该文件并返回。
3.前端向服务端发送请求并上传文件hello.jpg。
4.服务端收到前端请求,将前端上传的文件以MultipartFile接收,然后希望保存在分类的文件夹下,例如:
D:/test/2018/11/hello.jpg
其中basePath为D:/test/,所以扩展路径为2018/11/hello.jpg。扩展路径需要保存在数据库中。
服务端将接收到的MultipartFile以流的形式保存到D:/test/2018/11/hello.jpg。然后将2018/11/hello.jpg存入数据库。
5.前端向服务端请求图片。
6.服务端从数据库中取出图片扩展路径,为2018/11/hello.jpg。然后将该路径返回给前端。
7.前端收到扩展路径2018/11/hello.jpg,将服务端路径与扩展路径进行拼装,为:
192.168.x.xx:8030/Template/photo/2018/11/hello.jpg
然后使用该路径请求图片。
8.Tomcat收到请求,根据设置的映射路径,将包含/Template/photo在内的左侧路径转换为D:/test,于是图片地址变为D:/test/2018/11/hello.jpg。这样Tomcat就准确地取到了路径,并返回给前端。