Spring的文件上传和下载(可套用的模板)

本文详细介绍如何在Spring MVC框架中实现文件的上传与下载功能,包括单文件和多文件的上传过程,以及通过URL触发的文件下载请求处理。

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

文件上传

单文件下载

三步搞定单文件下载

  1. 在配置文件里面配置好CommonsMultipartResolver类
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>//设置上传文件的最大size
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

需要下载commons-fileupload-1.3.3.jar和commons-io-2.6.jar,下载网址为
点我
2. jsp只需要一个file框,这里我展示一个比较简陋的jsp的部分内容

  <form action="/CSDNWEB_war_exploded/fileUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/><br>
    <input type="submit" value="提交"><br>
  </form>

3.写好相应的Conntroller类,我这里展示比较通用的代码,RequestParam里面的required属性如果表示true,传入的参数里面就必须有file,这里的文件对象我们使用Spring里面的MultipartFile ,因为里面帮我们包装好了许多好用的方法,这里就说我在下面使用的一些
file.getOriginalFilename():获取原来的文件名
file.transferTo();将文件保存到一个目录文件中
单文件上传就这样配置完成了

    @RequestMapping("/fileUpload")
    public String fileUpLoad(@RequestParam(value = "file",required = false) MultipartFile file,HttpServletRequest request, ModelMap modelMap){
        String filepath = request.getSession().getServletContext().getRealPath("upload");
        // 这个是你需要保存的文件路径,你们可以修改为自己的,如果不修改就需要在服务器发布的文件夹里寻找
        String filename = file.getOriginalFilename();
        // 这个是文件名,我这里选择原本文件上传的名字,读者也可以修改
        if (filename==null){
            filename = "未命名文件";
        }
        File targetFile = new File(filepath,filename);
        if (!targetFile.exists()){
            targetFile.mkdirs();
        }
        try {
            file.transferTo(targetFile);
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("文件转换失败");
        }
        return "success";
    }

多文件上传

  1. 第一步和单文件一样
  2. jsp,就在file里面加入一个multple属性,这里还是展示
<form action="/CSDNWEB_war_exploded/manyFileUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="files" multiple="multiple"><br><br>
    <input type="submit" value="上传">
</form>
  1. 相应的controller类,代码可能有冗余哈,请见谅
@RequestMapping("/manyFileUpload")
    public String manyFileLoad(@RequestParam(value = "files",required = false) List<MultipartFile> files,
                               HttpServletRequest request){
        if (!files.isEmpty()&&files.size()>0){
            for (MultipartFile file:files){
                String oriFileName = file.getOriginalFilename();
                String tarpath = request.getServletContext().getRealPath("/upload");
                //这个是你想要上传文件夹的地址,需要自行修改
                File filepath = new File(tarpath);
                if (!filepath.exists()){
                    filepath.mkdirs();
                }
                String newFileName = "加上你自己想要的前缀"+"_"+ UUID.randomUUID() +oriFileName+oriFileName;
                try {
                    file.transferTo(new File(tarpath,newFileName));
                }catch (IOException e){
                    e.printStackTrace();
                    System.out.println("文件转换失败");
                    return "error";
                }
            }
            return "success";

        }
        else {
            System.out.println("文件为空");
            return "error";
        }

    }

文件下载

  1. 我们这里选择使用一个url表示一个下载请求url:/download?filename=文件名 表示一个下载请求,所以我们写一个Controller处理download请求,ResponseEntity这个对象也是Spring替我们包装好了,用于我们浏览器处理我们文件的相关信息,操作代码如下:
public ResponseEntity<byte[]> download(@RequestParam(value = "filename") String filename, HttpServletRequest request){
        String path = request.getServletContext().getRealPath("/upload");
        // 这是你服务器放资源文件的地址,需要自行修改
        File file = new File(path+File.separator+filename);
        HttpHeaders httpHeaders = new HttpHeaders();
        try {
        // 这里解决部分浏览器下载带有中文名称的文件的时候失败的问题
            String downFileName = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
            httpHeaders.setContentDispositionFormData("attachment",downFileName);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        try {
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),httpHeaders, HttpStatus.CREATED);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;

    }

谢谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值