基于 spring-web 的文件上传与下载

本文介绍了基于Spring-Web的文件上传与下载操作。在文件上传中,讲解了form表单的设置要求,以及Spring如何简化服务端接收文件的处理。在文件下载部分,讨论了两种下载形式,并给出了简单的下载代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.文件上传

     1.文件上传时,对页面的 form 表单有如下要求:

        1.method = "post" 即采用 post 方式提交数据

        2.enctype = "multipart/form-data" 即采用 multipart 格式上传文件

        3.type = "file" 即使用 input 的 file 控件上传

        示例:

<form method="post" action="" enctype="multipart/form-data">
  <input name="" type="file" />
  <input value="" type="submit" />
</form>

        目前一些前端组件库也提供了相应的上传组件,但其底层原理还是基于form表单的文件上传

    2.服务端接收客户端页面上传的文件,通常都会使用 Apache 的两个组件

        1.commons-fileupload

        2.commons-io

        spring 框架在 spring-web 包中对文件上传进行了封装,大大简化了服务端代码,我们只需要在 Controller 方法中声明一个 MultipartFile 类型的参数即可,例如:  

public R<String> upload(MultipartFile file){}

        一次简单的完整的上传代码 

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file)
    {
        // file 是一个临时文件,需转存到指定位置,否则本次请求完成后临时文件会删除


        // 原始文件名
        String fileName = file.getOriginalFilename();

        String suffix = fileName.substring(fileName.lastIndexOf("."));
        // 使用 uuid 重新生成文件名,防止文件名重复造成文件覆盖
        fileName = UUID.randomUUID().toString() + suffix;

        File baseFile = new File(basePath);
        if (!baseFile.exists())
            baseFile.mkdirs();
        // 将临时文件转存
        try {
            file.transferTo(new File(basePath + fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.success(fileName);
    }

     

2.文件下载

    通过浏览器进行文件下载,通常有两种表现形式:

        1.以附件形式下载

        2.直接在浏览器中打开

    通过浏览器下载,本质上就是服务端将文件以流的形式写回浏览器的过程

        一次简单的下载图片的代码:

 @GetMapping("/download")
    public void download(String name, HttpServletResponse response)
    {
        // 设置相应格式
        response.setContentType("image/jpeg");

        // 输入流,通过输入流读取文件内容
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
            // 输出流,通过输出流将文件写回浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            int len = 0;
            byte[] b = new byte[1024];

            while ((len = fileInputStream.read(b)) != -1)
            {
                outputStream.write(b, 0 ,len);
                outputStream.flush();
            }

            outputStream.close();
            fileInputStream.close();


        } catch (IOException e) {
            e.printStackTrace();
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值