ssm框架中基于springMVC进行的文件上传.

来源:互联网 发布:一个人失忆薛凯琪 知乎 编辑:程序博客网 时间:2024/04/26 05:25

在做ssm的文件上传的时候, 前面起码是已经整合好了, 最少新建一个项目, 写一个Controller,项目可以跑起来, 也能被访问成功. 如果还没有整合成功.

请看这里: http://blog.csdn.net/liu72849/article/details/78003992


可能需要用到的几个依赖,基于maven的添加到pom.xml文件:

<dependency>            <groupId>commons-fileupload</groupId>            <artifactId>commons-fileupload</artifactId>            <version>1.3.1</version>        </dependency>        <dependency>            <groupId>commons-io</groupId>            <artifactId>commons-io</artifactId>            <version>2.4</version>        </dependency>        <dependency>            <groupId>commons-codec</groupId>            <artifactId>commons-codec</artifactId>            <version>1.10</version>        </dependency>



配置完成之后, 我们还要针对文件上传在配置文件中添加新的标签.

在spring-mvc.xml(基于上面网站中的配置文件)中添加:

<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->    <bean id="mappingJacksonHttpMessageConverter"          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">        <property name="supportedMediaTypes">            <list>                <value>text/html;charset=utf-8</value>            </list>        </property>    </bean>    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->    <bean            class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">        <property name="messageConverters">            <list>                <ref bean="mappingJacksonHttpMessageConverter"/><!-- json转换器 -->            </list>        </property>    </bean>    <!-- 支持上传文件 -->    <bean id="multipartResolver"          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <!-- 100M -->        <property name="maxUploadSize" value="104857600"></property>        <property name="defaultEncoding" value="utf-8"></property>    </bean>



然后我这里是写的一个根据上传的文件名称 取唯一值 以及根据上传文件名称 生成两级目录的工具类.

package com.ssm.utils;//jdk中的UUID类.import java.util.UUID;//定义一个解决上传时候, 产生因用户上传文件名称相同导致上传过来的文件被覆盖这个问题.public class StringUuid {@SuppressWarnings("unused")//获取一个唯一值.public static String getUuidFilename(String filename) {// 首先, 将传进来的文件名, 进行截取, 只保留 .xxx的后缀名.// 在这个文件名, 截取 " . "和它后面的字符串String substring = filename.substring(filename.lastIndexOf("."));// 接着使用 jdk的API中带有的 UUID.randomUUID().toString()方法产生一个随机且不重复的字符串.String replace = UUID.randomUUID().toString().replace("-", "");// 将这个随机产生的字符串 作为文件的前缀名, 再加上后缀名称就可以避免用户上传同名文件产生 文件被覆盖这个问题.String filenames = replace + substring;return filenames;}//通过文件名称创建二级目录.public static String getRealPath(String uUidfilename){//首先, 将唯一的文件名变成一个 hash值.int hashCode1 = uUidfilename.hashCode();//然后 将这个hash值和 0xf(也就是二进制的 1111)做 位与运算.int hashCode2 = hashCode1 & 0xf;//将做完位与运算的结果右移4位.int hashCode3 = hashCode2>>>4;//将右移完了的结果 再次和 1111这个二进制数进行 位与运算.int hashCode4 = hashCode3 & 0xf;//之后, 将 第一次的位与运算得到的数字作为 一级目录, 将 第二次的位与运算得到的数字作为二级目录.return "/"+hashCode2+"/"+hashCode4;}}


接着在Controller(handler)中,写一个接收上传文件的方法.

package com.ssm.controller;import java.io.File;import java.io.IOException;import java.util.List;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import com.ssm.dto.Uploadfile;import com.ssm.service.UploadService;import com.ssm.utils.StringUuid;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;@Controller@RequestMapping("/TUser")public class UserController {//    注入文件上传的业务层.    @Resource    private UploadService uploadService; @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)    @ResponseBody    public String upload(MultipartFile file, HttpServletRequest request,Model model) throws IOException {//        获取我们准备好的用于存储上传文件的绝对路径.        String paths = request.getSession().getServletContext().getRealPath("upload");//        获取上传过来的原始文件名.        String fileName = file.getOriginalFilename();        System.out.println(fileName);//        IE浏览器在上传的时候会将盘符路径也传递过来.截取文件名.//        lastIndexOf()方法, 指定从 该字符串中的 最后一个  "\"号后开始截取.        String lastfile = fileName.substring(fileName.lastIndexOf("\\") + 1);//        将截取后的文件名使用UUID,生成一个唯一的文件名称,        String filenameuuid = StringUuid.getUuidFilename(lastfile);//        将唯一的文件名, 传入这个方法,得到目录分离//        这是根据传递过来的文件名称在upload这个主存储文件夹下生成其他字文件夹.        String realPath = StringUuid.getRealPath(filenameuuid);//        将主存储目录名称和子文件夹名称连接在一起.        String path = paths + realPath;//        生成文件夹以及生成准备接收内容的文件.        File dir = new File(path,filenameuuid);        System.out.println(dir);//        如果该文件夹不存在则创建.        if (!dir.exists()) {            dir.mkdirs();        }//        MultipartFile自带的解析方法.底层将上传的文件以流对流的方式接收内容.        file.transferTo(dir);//        获取这个文件存储的虚拟全路径.        String contextPath = request.getContextPath();//获取项目名称.//        获取域名+项目名称        String basePath = request.getScheme()+"://"+request.getServerName()+":"+ request.getServerPort()+contextPath+"/";        System.out.println(basePath);//        获取上传文件的虚拟路径全名称.        String relatedAddress = basePath+"upload"+realPath+"/"+filenameuuid;//        将这个虚拟路径存储到数据库中(对应的实体类中)。        Uploadfile uploadfile = new Uploadfile();        uploadfile.setPath(relatedAddress);//        将对象存入数据库中。这一步实际上就是向数据库表中存一个实现定义好了的pojo类.//        能做到文件上传这里的话, 自己写一个保存pojo实体类内容到对应表中应该不会有问题.略过步骤        uploadService.insertUploadfile(uploadfile);//        将虚拟路径存储到request域中。 这里使用springMVC的model进行存储并返回。        System.out.println(relatedAddress);//        这一步就是练着玩的.实际底层就是向一个request域对象存值.//        model.addAttribute("name", Object);//        这里的返回值根据实际要求返回, 可以返回要跳转的页面, 也可以返回一串字符串到要html页面, 在页面根据这个接收到的返回值进行其他步骤.        return "ok!";    }}

具体的业务层和DAO层自己写就好.

html就不写了.网上一大堆的资源.


原创粉丝点击