欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

springboot不同版本上传(及大小限制)和下载文件(及中文乱码失败)问题

程序员文章站 2022-04-30 22:33:31
...

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