朋友圈发布、头像更改等等都属于文件上传。SpringBoot为此提供了相关功能:MultipartFile。
1.文件上传处理器
根目录新建common包,该包下新建Constants.java类,该类存储常量,在该类中添加上传的文件存储路径,路径自由选择。
//文件上传保存路径
public final static String FILE_UPLOAD_PATH ="D:\\Projects\\uploadfile\\";
根目录新建controller包,该包下新建文件上传接收处理器UploadFileController.java
@Controller
public class UploadFileController {
@RequestMapping("/uploadfile")
@ResponseBody
public String upload_file(@RequestParam("file")MultipartFile file){
if(file.isEmpty()){
return "上传失败";
}
String filename = file.getOriginalFilename();
String suffixName = filename.substring(filename.lastIndexOf("."));
//文件保存名字 : 当前时间加随机数
SimpleDateFormat format =new SimpleDateFormat("yyyyMMdd_HHmmss");
Random random =new Random();
StringBuilder tempName =new StringBuilder();
tempName.append(format.format(new Date())).append(random.nextInt(100)).append(suffixName);
String newFileName = tempName.toString();
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(Constants.FILE_UPLOAD_PATH+newFileName);
Files.write(path,bytes);
}catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
return "上传成功";
}
}
2.前端页面
resources资源文件下的static包下新建upload_file.html,我们简单实现一下前端。
运行项目,然后打开浏览器访问该html: localhost:8080/upload_file.html
选择一个文件点击上传,然后查看服务端是否成功,路径下是否已经存在上传的文件。默认上传文件大小限制为1MB,如果想要更大,则可以配置,编辑application.properties文件,添加如下
#默认1MB
spring.servlet.multipart.max-file-size=20MB
#默认10MB
spring.servlet.multipart.max-request-size=20MB
3.访问上传的资源文件
前面我们完成了上传文件功能,那么我们仅仅上传,但是大多数情况下我们还要能够访问该资源文件。
根目录下新建config包,该包下新建MyWebMvcConfigurer.java,该类实现WebMvcConfigurer接口,在此我们要映射资源文件。
打开前面建立的Constants类,我们添加文件访问路径,
public final static StringFILE_ACCESS_PATH ="/uploadfile/";
这样我们访问localhost:8080/uploadfile/文件名字 浏览器就能获得该资源文件
Constants类内容如下
public class Constants {
//文件上传保存路径
public final static StringFILE_UPLOAD_PATH ="D:\\Projects\\uploadfile\\";
//文件访问路径
public final static StringFILE_ACCESS_PATH ="/uploadfile/";
}
MyWebMvcConfigurer实现如下
@Configuration
public class MyWebMvcConfigurerimplements WebMvcConfigurer {
/**
* 所有以uploadfile开头的静态资源请求 都会映射到Constants.FILE_UPLOAD_PATH目录
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(Constants.FILE_ACCESS_PATH+"**").addResourceLocations("file:"+ Constants.FILE_UPLOAD_PATH);
}
}
我们现在上传一个文件,在这上传一张图片,
我们现在访问该文件,浏览器访问 localhost:8080/uploadfile/20200225_22201975.JPG
如果访问的是视频,那么浏览器会自动播放,其他的比如一个zip文件或者安装包什么的访问后浏览器会默认自动下载。