java 文件上传与下载

Ⅰ、文件上传
一、form-data 类型

form-data 类型即常用的表单提交

两种处理参数的方式

  • MultipartFile 类接受前台传过来的文件
  • part 接收字节流

@RequestPart 作用类似 @RequestParam

2、文件上传接口

直接上代码

@RestController
public class TestFile {
    private BufferedOutputStream bufferedOutputStream = null;

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    @ResponseBody
    public String readFile(HttpServletRequest request, @RequestParam("name") String name, @RequestPart("file1") MultipartFile file3,@RequestPart("photo") MultipartFile photo) throws IOException, ServletException {
       
        String path= "I:\\spring\\spring-mybatis-plus\\src\\main\\resources\\public\\static\\";

        System.out.println(name);
        /*
        第一种 : 使用 MultipartFile 封装好的 transferTo() 方法保存文件
        photo.transferTo(new File(path+photo.getOriginalFilename()));

        第二种 :  使用 MultipartFile 字节流保存文件
         fileUtil(file3, String.valueOf(path));

        第三种 :  使用 Part 接收文件字节流
        Part file2 = request.getPart("file2");
        file2.write(path + file2.getSubmittedFileName());
        */
        // request.getParts() 获取的是全部参数(name,age,file1,file2),包括文件参数和非文件参数
        for (Part part : request.getParts()) {
            // 获取文件类型
           part.getContentType();
            // 获取文件大小
           part.getSize();
            // 获取文件名
           part.getSubmittedFileName();
           // 获取参数名 (name,age,file1,file2)
           part.getName()
            if(part.getContentType()!=null){
                part.write(path + part.getSubmittedFileName());
            }else{
                 // 可以获取文本参数值,文本参数 part.getContentType() 为 null
                   request.getParameter(part.getName())
            }
        }
        return "success";
    }

    public String fileUtil(MultipartFile file, String path) {

        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(
                        new File(path + file.getOriginalFilename())));
                bufferedOutputStream.write(bytes);
                bufferedOutputStream.close();
                return file.getOriginalFilename() + "success upload";
            } catch (Exception e) {
                return file.getOriginalFilename() + "failed to upload ---> " + e;
            }
        } else {
            return file.getOriginalFilename() + "You failed to upload file was empty.";
        }
    }
}

 

实际开发中,上面有很多需要优化的地方,比如写出文件工具类,获取项目路径(注意测试和打包上线路径),三种方法使用一种即可,流参数输出之后,就获取不到,不像其他参数可以在该请求的任意位置获取。

如果一个输入框多个文件,可以使用

List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("");
// 也可以使用 part.getName() 获取参数名做判断
part.getName()
 

或者 MultipartFile[] file3

    public String readFile(HttpServletRequest request, @RequestParam("name") String name, @RequestPart("file1") MultipartFile[] file3) 
 

3、 测试

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值