springMVC文件上传和下载功能

2018-08-13 07:39:36来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

文件上传

      为了能够将文件上传成功,需要将表单的method属性设置成POST,enctype设置成multipart/form-data,一旦设置为multipart/form-data,浏览器会以二进制处理表单数据,spring默认不能处理文件上传工作,要在springmvc-config.xml配置文件中配置MulipartResolver。 

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 上传文件大小上限,单位为字节(10MB) -->
        <property name="maxUploadSize">
            <value>10485760</value>
        </property>
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding">
            <value>UTF-8</value>
        </property>
    </bean>

     配置好MultipartResolver后,实现文件上传的页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
<% String path = request.getContextPath(); %>
</head>
<body>
    <h2>文件上传</h2>
    <form action="<%=path%>/upload" enctype="multipart/form-data" method="post">
        <table>
            <tr>
                <td>文件描述:</td>
                <td><input type="text" name="description"></td>
            </tr>
            <tr>
                <td>请选择文件:</td>
                <td><input type="file" name="file"></td>
            </tr>
            <tr>
                <td><input type="submit" value="上传"></td>
            </tr>
        </table>
    </form>
</body>
</html>

      创建一个FileUploadController,实现文件的上传功能,主要代码如下:

// 上传文件会自动绑定到MultipartFile中
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String upload(HttpServletRequest request, @RequestParam("description") String description,
            @RequestParam("file") MultipartFile file) throws Exception {
        System.out.println(description);
        // 如果文件不为空,写入上传路径
        if (!file.isEmpty()) {
            // 上传文件路径
            String path = request.getServletContext().getRealPath("/images/");
            // 上传文件名
            String filename = file.getOriginalFilename();
            String uuid = UUID.randomUUID().toString();
            String name = uuid + filename.substring(filename.lastIndexOf("."));
            File filepath = new File(path, name);
            // 判断路径是否存在,如果不存在就创建一个
            if (!filepath.getParentFile().exists()) {
                filepath.getParentFile().mkdirs();
            }
            // 将上传文件保存到一个目标文件当中
            file.transferTo(new File(path + File.separator + name));
            // 将文件复制到开发工程路径
            File source = new File(path + File.separator + name);
            File files = new File("D:\\workspace\\FileUpload\\WebContent\\image" + File.separator + name);
            Files.copy(source.toPath(), files.toPath());
            HttpSession session = request.getSession();
            session.setAttribute("path", "/image" + File.separator + name);
            session.setAttribute("name", name);
            return "success";
        } else {
            return "error";
        }

文件下载    

     以上就实现了文件的上传功能,下面我们来实现文件的下载功能,文件的下载相对比较简单,只需要在页面给出一个链接,将该链接的href属性等于要下载的文件的文件名,就可以实现下载,springmvc提供了一个ResponseEntity类型,使用它可以很方便地定义返回的 HttpHeaders和HttpStatus。

    下载页面(success.jsp):

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>文件下载</title>
<%
    String name = (String) request.getSession().getAttribute("name");%>
</head>
<body>
    <p>上传成功</p>
    <h3>文件下载</h3>
    <a href="download?filename=<%=name%>"> <%=name%>
    </a>
</body>
</html>

   处理方法接受页面传递的文件名filename后,使用Apache Commons FileUpload组件的FileUtils读取项目的上传文件,并将其构建成ResponseEntity对象返回客户端下载。

@RequestMapping(value = "/download")
    public ResponseEntity<byte[]> download(HttpServletRequest request, @RequestParam("filename") String filename,
            Model model) throws Exception {
        // 下载文件路径
        String path = request.getServletContext().getRealPath("/images/");
        File file = new File(path + File.separator + filename);
        HttpHeaders headers = new HttpHeaders();
        // 下载显示的文件名,解决中文名称乱码问题
        String downloadFielName = new String(filename.getBytes("UTF-8"), "iso-8859-1");
        // 通知浏览器以attachment(下载方式)打开图片
        headers.setContentDispositionFormData("attachment", downloadFielName);
        // application/octet-stream : 二进制流数据(最常见的文件下载)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
    }

以上就是文件的上传和下载,如有异常欢迎留言交流!

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java_万年历(简单)

下一篇:使用webuploader上传word文件,前端用电子书的方式预览展示