SpringBoot实现文件上传下载功能详解(附带中文名称显示乱码问题的解决)

文件上传模块:

首先,需要设置一个存放上传文件的目录,可以在接口中指定,也可以在配置文件中提前设置好。

这边采用的是配置文件的形式,在application.properties中指定路径为static下的files文件夹

#存放上传文件的目录
fileLocation=static/files

#请求下载文件的源目录
fileDownload=static/downLoad

然后,通过@Value注解的方式拿到该目录的值,注入到自定义的变量中

    @Value("${fileLocation}")
    private String fileLocate;

    @Value("${fileDownload}")
    private String FileDownLoad;

其次,通过拼接的方式获取该目录的绝对路径,将此路径转换为抽象路径名来创建一个File实例(这里的file并非是真实的文件,下图为官方的解释)。

然后,判断该路径是否存在,若不存在则需要生成该目录

最后,将前端传来的文件保存在该目录下,整个上传功能到此就结束了。

上传模块的完整代码如下(不要忘记存放目录路径的配置):

 @PostMapping("/upload")
    public void FileUpload(MultipartFile file, HttpServletRequest request) throws IOException
    {
        //获取存放上传文件的绝对路径
        String realPath = ResourceUtils.getURL("classpath:").getPath()+fileLocate;

        //创建一个file对象
        File newFile = new File(realPath);

        //测试此路径是否存在,若不存放则生成该路径
        if(!newFile.exists())
            newFile.mkdirs();
        //在指定目录下生成该文件
        file.transferTo(new File(newFile,file.getOriginalFilename()));

    }

成功上传的图片会出现在target.classes.static.files目录下,如下图(target目录需要编译后才会生成)

 另外,在application.properties文件里也可以对上传文件的大小进行配置,如下文件上传模块

#设置总共上传的文件大小
spring.servlet.multipart.max-request-size=10MB

#设置单个上传文件的大小
spring.servlet.multipart.max-file-size=5MB

 文件下载模块:

首先,需要有一个存放下载文件的目录,在static下新建一个download目录,放入要测试的文件

 然后,设置响应头,告诉前端要以附件的形式打开该文件

其次,获取文件的输入流,创建文件的输出流对象,通过缓冲区的方式从输入流中读入数据,再写到输出流中,知道缓冲区不再有数据。

最后,先关闭输出流,再关闭输入流。

注意:当请求下载的文件是中文名称时,需要对文件名的编码转为utf-8格式,不然后端接受的文件名是乱码,导致无法成功下载。

下载模块的完整代码如下(下载文件路径的配置如上):

@GetMapping("/download/{fileName}")
    public void FileDownload(@PathVariable String fileName, HttpServletResponse response) throws IOException
    {
        //获得待下载文件的绝对路径
        String realPath = ResourceUtils.getURL("classpath:").getPath()+FileDownLoad;

        //获取文件输入流
        FileInputStream fileInputStream = new FileInputStream(new File(realPath,fileName));

        //设置响应头、以附件形式打开文件
        //response.setHeader("content-disposition","attachment;filename="+fileName);

        //文件名包含中文时需要进行中文编码,否则会出现乱码问题
        response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));

        ServletOutputStream servletOutputStream = response.getOutputStream();
        int len = 0;

        //设置一个缓冲区,大小取决于文件内容的大小
        byte[] buffer = new byte[1024];
        //每次读入缓冲区的数据,直到缓冲区无数据
        while((len=fileInputStream.read(buffer))!=-1)
        {
            //输出缓冲区的数据
            servletOutputStream.write(buffer,0,len);
        }
        servletOutputStream.close();
        fileInputStream.close();
    }

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值