SpringMvc学习-5-Spring MVC 文件上传

本文介绍如何在Spring MVC项目中实现文件上传和下载功能。通过引入commons-fileupload依赖,并配置文件上传解析器MultipartResolver,实现多部分请求处理。前端表单需设置enctype属性为multipart/form-data。控制器处理文件上传限制大小并重命名文件,下载功能则通过响应头设置触发浏览器下载。

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

文件上传,需要加入commons-fileupload包,maven项目加入依赖:

 <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>

在springmvc.xml中加入文件上传解析器配置:

<!-- 配置文件上传解析器 MultipartResolver -->
	<bean id="multipartResolver" class=
   "org.springframework.web.multipart.commons.CommonsMultipartResolver">
          <!-- 设置请求编码格式-->
          <property name="defaultEncoding" value="UTF-8" />
	</bean>

前端页面上传文件,form表单 需要加入 enctype="multipart/form-data" 

如下:

<form action="${pageContext.request.contextPath }/fileUpload" method="post" enctype="multipart/form-data" onsubmit="return check()">
<input id="file" type="file" name="uploadfile" multiple="multiple" />

文件上传Controller


@Controller
public class FileUploadController {
    /**
     * 文件上传
     * @param name
     * @param uploadfile
     * @param request
     * @return
     * @throws MyException
     */
    @RequestMapping("/fileUpload")
    @ResponseBody
    public Map<String,Object> handleFormUpload(@RequestParam("name") String name,
                                                            @RequestParam("uploadfile") List<MultipartFile> uploadfile,
                                                    HttpServletRequest request) throws MyException {
        Map<String, Object> map = new HashMap<String, Object>();
        // 判断所上传文件是否存在
        if (!uploadfile.isEmpty() && uploadfile.size() > 0) {
            //循环输出上传的文件
            for (MultipartFile file : uploadfile) {
                if(file.getSize()>1024*10240){
                    System.out.println(MyException.getStackTrace("文件大小超过10M无法上传!"));
                    throw new MyException("文件大小超过10M无法上传!");
                }
                // 获取上传文件的原始名称
                String originalFilename = file.getOriginalFilename();
                // 设置上传文件的保存地址目录
                String dirPath =
                        request.getServletContext().getRealPath("/upload/");
                File filePath = new File(dirPath);
                // 如果保存文件的地址不存在,就先创建目录
                if (!filePath.exists()) {
                    filePath.mkdirs();
                }
                // 使用UUID重新命名上传的文件名称(上传人_uuid_原始文件名称)
                String newFilename = name+ "_"+UUID.randomUUID() +
                        "_"+originalFilename;
                map.put("url", dirPath+newFilename);
                map.put("fileName", newFilename);
                map.put("saveAddress", dirPath);
                try {
                    // 使用MultipartFile接口的方法完成文件上传到指定位置
                    file.transferTo(new File(dirPath + newFilename));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 跳转到成功页面
            return  map;
        }else {
            return null;
        }
    }

    /**
     * 文件下载
     * @param request
     * @param response
     * @param filename
     */
    @RequestMapping("/download")
    public void downloadFile(HttpServletRequest request, HttpServletResponse response,
                             String filename){

        String rootDir = request.getSession().getServletContext().getRealPath("/upload/");

        //要保存的目录路径
        String path = rootDir+File.separator;
        File saveDir = new File(path);
        if (!saveDir.exists()) {
            saveDir.mkdirs();// 如果文件不存在则创建文件夹
        }
        //文件路径
        path = path + File.separator + filename;
        File tempFile = new File(path);   //初始化临时文件
        try {
            // 以流的形式下载文件。
            BufferedInputStream fis = new BufferedInputStream(
                    new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + tempFile.length());
            OutputStream toClient = new BufferedOutputStream(
                    response.getOutputStream());
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(tempFile!=null&&tempFile.exists()){
                tempFile.delete();//删除临时文件
            }
        }

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值