spring mvc文件上传和下载

来源:互联网 发布:安捷伦34401a 编程 编辑:程序博客网 时间:2024/06/05 14:40

本篇博客将讲解的是spring mvc的文件上传和下载功能。对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能。而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的功能。

搭建spring mvc开发环境
参考基于maven搭建ssm项目(项目名spring_mvc)
http://blog.csdn.net/qq1940879801/article/details/76790592

一 配置文件上传下载
配置pom.xml:

    <dependencies>        <!-- 文件上传下载 -->        <dependency>            <groupId>commons-fileupload</groupId>            <artifactId>commons-fileupload</artifactId>            <version>1.3.2</version>        </dependency>    </dependencies>

配置springmvc-mvc.xml:

    <!-- 配置视图解析器 -->    <bean id="viewResolver"        class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/page/"></property>        <property name="suffix" value=".jsp"></property>    </bean>    <!-- 文件上传下载 -->    <bean id="multipartResolver"        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <!--上传文件的最大大小 -->        <property name="maxUploadSize" value="17367648787"></property>       <!-- 上传文件的编码 -->        <property name="defaultEncoding" value="UTF-8"></property>    </bean>

二 实现文件上传的功能(所有jsp文件都放在/WEB-INF/page/)
2.1首先我们在新建一个jsp页面,命名为:upload.jsp,放在写一个上传的页面form表单,其中一定要注意的是在表单的属性中添加entcypt=”multipart/form-data”,这表示上传的将会是二进制流的格式,以规定的二进制进行上传,便于服务器处理,使用post请求:

<body>    <form action="upload" enctype="multipart/form-data" method="post">        <table>            <tr>                <td>请选择文件:</td>                <td><input type="file" name="file"></td>            </tr>            <tr>                <td>开始上传</td>                <td><input type="submit" value="上传"></td>            </tr>        </table>    </form></body>

2.2 再写一个上传成功的jsp页面,主要是用来当上传成功时候跳转的页面,命名为:success.jsp

  <body>    <h2>文件上传成功!</h2>    </body>

2.3 然后再写一个上传失败的页面,主要是用来当上传失败的时候跳转的页面,命名为:error.jsp

<body>  <h2>文件上传失败!请检查文件是否存在</h2></body>

2.4:写好了jsp页面,接下来就是写我们的控制器了,spring mvc控制器,在我们的com.imooc.mvcdemo中写一个FileUploadDownloadController类,然后写上具体的代码,如下所示,注意其中使用MultipartFile来接受form表单传过来的file文件,MultipartFile有几个核心的api,可以供我们使用,比如 boolean isEmpty(),用来判断文件是否为空。void transferTo( File file),把文件写入目标路径地址.

package com.imooc.mvcdemo;@Controllerpublic class UploadDownloadController {    //文件存放位置    private final static String SAVE_FILE_PATH="E:\\spring_mvc\\imgs";    @RequestMapping(value = "/{formName}")    public String loginForm(@PathVariable String formName) {        return formName;    }    // 访问路径http://localhost:8080/spring_mvc/upload    @RequestMapping(value = "/upload", method = RequestMethod.POST)    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {        if (!file.isEmpty()) {            // 存放我们上传的文件路径的文件名            String fileName = file.getOriginalFilename();            File filePathName = new File(SAVE_FILE_PATH, fileName);            if (!filePathName.getParentFile().exists()) {                filePathName.getParentFile().mkdirs();// 如果目录不存在,创建目录            }            try {                file.transferTo(filePathName);// 把文件路径的文件名写入目标文件地址            } catch (Exception e) {                return "error";// 返回到失败的页面            }            return "success";// 返回到成功页面        } else {            return "error";// 返回到失败的页面        }    }}

2.5:好了,到此我们就可以实现上传功能了,发布在Tomact容器里,然后就可以进行上传文件了。在浏览中输入:http://localhost:8080/spring_mvc/upload具体的页面请求如下,然后浏览具体的文件,点击上传按钮,选择好了文件,点击上传。
到了这一步还没完,我们再往下看,有没有写入目标文件夹,也就是在D:\userUploadFile\Files目录下看是否存在我的上传文件,查看是存在的也就是正确写入了
这里写图片描述

三:将上传文件绑定到具体的对象上

3.1:首先我们来定义一个实体类User,这个实体类中的headimage属性的主要作用就是用来映射我们上传的文件,可以看到它是MultipartFile类型的:

public class User implements Serializable {// 用户实体类    private String userName;    private MultipartFile headimage;// 上传文件会自动绑定到该属性    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public MultipartFile getHeadimage() {        return headimage;    }    public void setHeadimage(MultipartFile headimage) {        this.headimage = headimage;    }}

3.2:然后写我们的 jsp上传页面,这里我们来模拟一个用户注册上传头像的场景,新建一个registerForm.jsp页面,然后写一个form表单,如下:

<body>    <h2>用户注册</h2>    <form action="register" enctype="multipart/form-data" method="post">        <table>            <tr>                <td>用户头像:</td>                <td><input type="file" name="headimage"></td>            </tr>            <tr>                <td>上传:</td>                <td><input type="submit" value="上传"></td>            </tr>        </table>    </form></body>

3.3:写我们的方法控制器处理注册逻辑的层的代码,注意其中的user对象加入了@ModelAttribute注解,其主要作用是用来映射把上面的form表单的headimage属性自动注入到对象里面,还有Map

    // 访问路径http://localhost:8080/spring_mvc/register    @RequestMapping(value = "/register", method = RequestMethod.POST)    public String reg(@ModelAttribute User user, HttpServletRequest request, Map<String, Object> map) {        MultipartFile headimage = user.getHeadimage();        boolean empty = headimage.isEmpty();        if (!empty) {            String headimageName = headimage.getOriginalFilename();            File filepath = new File(SAVE_FILE_PATH, headimageName);            if (!filepath.getParentFile().exists()) {                filepath.getParentFile().mkdirs();// 如果目录不存在,创建目录            }            try {                headimage.transferTo(filepath);            } catch (Exception e) {                return "error";            }            map.put("user", user);            return "userInfo";        } else {            return "error";        }    }

3.4:我们来新建一个jsp页面,取名为userInfo.jsp,其主要作用是显示刚才的我们的文件名:

<body>用户头像:${requestScope.user.headimage.originalFilename}</body>

3.5:页面写完了,我们在来模拟测试一下,在客户端Ie浏览器中,输入http://localhost:8080/spring_mvc/register

四:实现用户下载的功能

4.1:首先我们来改造一下刚才的userInfo.jsp页面,主要目的是为了把它变成一个下载的连接,然后用我们就可以写我们的控制器用来处理href的请求来了。其中可以看到我们使用了el表达式把url传递给下一个控制器,控制器可以取出这些值进行处理:

<body>    <h3>文件下载</h3>    <a href="download?filename=${requestScope.user.headimage.originalFilename}">        用户头像:${requestScope.user.headimage.originalFilename}     </a></body>

4.2:来看看我们的download控制器代码:注意download方法返回的是ResponseEntity

    // 访问路径http://localhost:8080/spring_mvc/download/filename=girl.jpg    @RequestMapping(value="/download",method=RequestMethod.GET)    public ResponseEntity<byte[]> download(HttpServletRequest request,@RequestParam("filename") String filename, Model model) throws IOException{        String filenameStr=new String(filename.getBytes("iso-8859-1"),"UTF-8");//设置编码        File file = new File(SAVE_FILE_PATH,filenameStr);//新建一个文件        HttpHeaders headers = new HttpHeaders();//http头信息        headers.setContentDispositionFormData("attachment", filenameStr);        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);        //MediaType:互联网媒介类型  contentType:具体请求中的媒体类型信息        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);    }

4.3:我们来测试一下写的东西是否能准确运行,点击超链接,注意此链接指向的地址:http://localhost:8080/spring_mvc/download?filename=xxxx,这就表示这个链接会去请求控制器,然后控制器进行处理下载, 这样就完成了文件的下载功能了
点击超链接进行下载

五:总结

本篇博文介绍了spring mvc上传和文件的功能,需要注意的地方就是对于文件上传包common-fileupload.jar包的使用,还有在配置文件上配置mulitipartResolver这个bean。下面又介绍了用java 实体类去映射上传文件的属性对应的文件,这点的好处就是它会自动映射,然后把对象放入到我们的请求域中,就可以展示给界面用户层,这也是mvc思想模式的体现。接下来是介绍去下载文件,只需要从我们的写入的目标地址去取出文件,再进行responseEntity对象的封装,就可以实现下载功能

参考资料

《spring+mybatis企业应用实战》

原创粉丝点击