springboot实现文件上传与下载

一: 文件上传

1.可以通过form表单测试,MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值 

2.也可以通过swagger测试,访问路径:http://127.0.0.1:8081/swagger-ui.html#/

3.postman调接口测试

例如:通过 form表单测试:

1) 前端页面代码:

<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
	头像:<input type="file" name="headerImg"><br>
	<input type="submit" value="上传">
</form>

2)controller层代码

@RestController
public class UploadController {
    // 文件上传 RequestMapping默认get请求
    @PostMapping("/upload")
    //MultipartFile对象是通过form表单的file类型请求的,是通过表单的name值获取的value值,也可以通过swagger测试
    public void upload(MultipartFile headerImg) throws IOException {
        // 单文件上传
        if (!headerImg.isEmpty()) {
            // 获取上传文件的原始名称,获取上传的文件的文件名 x.xxx(1.jpg)
            String originalFilename = headerImg.getOriginalFilename();
            // 设置上传文件的保存地址目录(存放在项目路径下)
            String dirPath = "E:\\Movie";

            // 字符串截取后缀名
//            String suffix = uploadFile.getOriginalFilename().substring(uploadFile.getOriginalFilename().lastIndexOf('.'));

            // 设置上传后的文件名称(拼接)  //获取uuid ,随机生成一个名字
            String newFileName = UUID.randomUUID() + "_" + originalFilename;

            //File.separator:自动匹配路径的分隔符(在不确定路径的分隔符是\还是/的时候可以使用)
            //上传文件
            headerImg.transferTo(new File(dirPath + File.separator + newFileName));
        }
    }
}

3)要上传大文件必须要配置yml文件

spring:
  #配置上传文件大小设置
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB  #单个文件的最大上限
      max-request-size: 30MB #单个请求的文件总大小上限


二: 文件下载

1.导入依赖

<!--文件下载-->
<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.6</version>
</dependency>

2.yml文件中配置

spring:
  # 设置文件大小
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 100MB

3.controller层测试代码

  (1) 根据浏览器的不同进行编码设,返回编码后的文件名

        在类中写这个方法即可:

public String getFileName(HttpServletRequest request, String filename) throws Exception {
        //IE不同版本User-Agent中出现的各种关键词
        String[] IEBrowserKeyWords = {"MSIE", "Trident", "Edge"};
        //获取请求头代理信息
        String userAgent = request.getHeader("User-Agent");
        for (String keyWord : IEBrowserKeyWords) {
            if (userAgent.contains(keyWord)) {
                //IE内核浏览器,统一为UTF-8编码显示
                return URLEncoder.encode(filename, "UTF-8");
            }
        }
        //其它浏览器统一为ISO-8859-1编码显示
        return new String(filename.getBytes("UTF-8"), "ISO-8859-1");
    }

     (2)下面 download()方法中的第二个参数filename是你想要下载的  文件名.后缀(例如:XXX.jpg),在发起请求的时候把文件名传进去,和文件路径拼接;

     也可以直接在代码中写死,删掉方法中第二个形参,在方法中声明 String filename = "文件名.后缀"。

    // 文件下载
    @PostMapping("/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request, String filename) throws Exception {
        // 确定要下载的文件路径
        String dirPath = "文件路径";

        // 创建该文件对象(谷歌所用)
        File file = new File(dirPath + "/" + filename);
        System.out.println(file);

        //对文件名编码,防止中文乱码
        filename = this.getFileName(request,filename);

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        // 通知浏览器以下载的方式打开文件
        headers.setContentDispositionFormData("attachment", filename);
        // 定义以流的方式下载返回文件的数据
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        // 将该对象读取时按字节传送
        byte[] array = FileUtils.readFileToByteArray(file);
        // 使用SpringMVC框架的ResponseEntity对象封装返回下载数据
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(array, headers, HttpStatus.OK);
        return responseEntity;
    }

在此,祝各位帅哥美女,步步高升,一帆风顺!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值