在做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就不写了.网上一大堆的资源.