springboot不同版本上传(及大小限制)和下载文件(及中文乱码失败)问题
1.文件上传
用springboot做文件上传的时候就要考虑到具体上传时文件的大小了,因为springboot默认限制是单文件1M,总大小10M,当超过限制的时候就会抛异常了,因此我们要做好上传文件时大小的配置信息。
springboot做文件上传有两种方式:配置文件配置和自定义bean配置类。
a.配置文件方法:在自己的yml或者properties配置文件中定义好单文件大小限制和总量限制。单位可以是KB,也可以是MB,如果不做限制的话,直接设置为-1即可
不同的版本号,配置的信息是不一样的,所以如果用这种方法的话,一定要确定自己使用的springboot的版本号是多少,否则可能会不起作用。下面附上不同版本号对应的属性。
Spring Boot 1.3.x and earlier
multipart.maxFileSize 单文件大小限制
multipart.maxRequestSize 总上传大小限制
Spring Boot 1.4.x and 1.5.x
spring.http.multipart.maxFileSize 单文件大小限制
spring.http.multipart.maxRequestSize 总上传大小限制
Spring Boot 2.x
spring.servlet.multipart.maxFileSize 单文件大小限制
spring.servlet.multipart.maxRequestSize 总上传大小限制
b.自定义配置类:第一种方法:用@configuration注解定义一个配置类,并创建MultipartConfigElement的实例,并用@bean将其注入spring容器;第二种方法:不用定义一个新的配置类,直接在springboot的启动类中创建MultipartConfigElement的实例,并用@bean将其注入spring容器。
@Configuration
public class FileUploadConfig {
@Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5MB");//单个文件大小限制
factory.setMaxRequestSize("50MB");//总上传数据总大小
return factory.createMultipartConfig();
}
}
此例是自定义配置类的方式,如果使用第二种方式的话,可以直接将下面部分添加到启动类中。
@Bean
public MultipartConfigElement multipartConfigElement(){
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5MB");//单个文件大小限制
factory.setMaxRequestSize("50MB");//总上传数据总大小
return factory.createMultipartConfig();
}
当然上面所说的都是从代码层面做的限制,如果放到服务器,可能还要考虑tomcat和nginx等配置的限制信息,这里就不做过多解释,具体情况具体分析。最后再附上一段上传的方法,使用的时候可以直接调用即可
/**
* 上传文件并返回文件的名字
*
* @param file
* @param filePath
* @param fileName
* @return
* @throws Exception
*/
public static String uploadFile(MultipartFile file, String filePath)
throws Exception {
String fileName = file.getOriginalFilename();
File targetFile = new File(filePath);
if (!targetFile.exists()) {
targetFile.mkdir();
}
FileOutputStream out = new FileOutputStream(filePath + fileName);
out.write(file.getBytes());
out.flush();
out.close();
return fileName;
}
2.文件下载
先贴上文件下载的代码
/**
* 下载模板
* @param request
* @param response
* @return
* @throws UnsupportedEncodingException
*/
@GetMapping("/download")
public ResponseData downloadFile(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
ResponseData rd = new ResponseData();
rd.setCode(Constant.FAIL_CODE);
// 设置文件路径,
File file = new File("模本文件的路径");
if (file.exists()) {
response.setContentType("application/force-download");// 设置强制下载不打开
//下载后文件的名字如果不处理中午,会发生问题
String fileNameEncode = java.net.URLEncoder.encode("自定义下载后文件显示的名称", "UTF-8");
response.addHeader("Content-Disposition", "attachment;fileName=" + fileNameEncode);// 设置下载的文件名
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
rd.setCode(Constant.SUCCESS_CODE);
return rd;
} catch (Exception e) {
logger.error("");
return rd;
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
logger.error("");
return rd;
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
logger.error("");
return rd;
}
}
}
} else {
rd.setMessage("模板文件不存在");
return rd;
}
}
下载时要注意的几点:
1.response.setContentType("application/force-download");// 设置强制下载不打开
2.content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )
字段说明:
Content-Disposition为属性名
disposition-type是以什么方式下载,如attachment为以附件方式下载
disposition-parm为默认保存时的文件名
3.中文乱码或失败问题解决思路可以参考https://blog.csdn.net/kpchen_0508/article/details/41653589
上一篇: 结婚两周年叫什么婚
下一篇: Java类加载器面试题集锦