注意:所有文章除特别说明外,转载请注明出处.
SpringMVC 文件上传
这里SpringMVC为文件上传提供最直接的支持,这种支持是由即插即用的MultipartResolve实现。
提示:我们在上传文件之前需要:
1.创建虚拟目录来保存文件,此虚拟目录会对应磁盘上的一个实际的目录,在实际中肯定有一个服务器专门存储资源,然后将该路径映射成一个虚拟目录,用来在程序中指定获取文件的路径
创建的方法:
1.在tomcat的配置文件中配置一下(server.xml)。
<Context docBase="E:\BangjinHu\projects\upload\" path="/file" reloadable="true"/>
2.然后编写后台Controller方法
1.配置CommonsMultipartResolver
SpringMVC配置文件配置支持文件上传类CommonsMultipartResolver
//配置文件上传解析器
//id名称必须是如此class名称后面的部分
<bean id="multipartResolver" class="org.springframework.web.multipart.CommonsMultipartResolver">
//配置文件上传解析器参数
//上传文件的最大大小
<property name="maxUploadSize" value="10240000"></property>
//上传文件的编码
<property name="defaultEncoding" value="utf-8"></property>
</bean>
2.控制层controller程序
提示:上传文件的逻辑是,首先判断有没有上传文件,如果已经上传了,那么对文件重命名然后写到磁盘中。如果没有上传文件,那么应该用原来的文件。
@Controller
public class UploadController {
@Resource
HttpServletRequest request;
/**
* @return 返回相对路径RelativePath
*/
public String RelPath() {
String path = request.getContextPath();
return request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
}
/**
* @return 返回服务器目录的真实路径
*/
public String RealPath() {
return request.getSession().getServletContext().getRealPath("/");
}
/**
* 单文件上传
*
* @param imageFile
* @param request
* @return
*/
@RequestMapping("/singleUpload")
public String singleUpload(@RequestParam("imageFile") MultipartFile imageFile, HttpServletRequest request){
//0.获取文件原来的名字
String filename = imageFile.getOriginalFilename();
//1.新建一个文件夹对象
File dir = new File(RealPath()+"upload/");
//2.检查路径下upload文件夹是否存在
if(!dir.exists()){
dir.mkdirs();
}
System.out.println("文件上传到:"+RelPath()+"upload/"+ filename);
//3.在文件夹下新建一个filename文件的文件对象,此处新建文件应该新建在确切的物理路径下
File targetFile = new File(RealPath()+"upload/"+ filename);
//4.判断真实路径下是否存在filename文件
if(!targetFile.exists()){
try {
//5.在真实路径下创建filename空文件
targetFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//6.复制文件到真实路径下,这里的文件只是一个路径?
imageFile.transferTo(targetFile);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("真实路径:"+RealPath()+"upload/");
System.out.println("相对路径:"+RelPath()+"upload/");
//非安全目录下使用(可用)
return "redirect:"+RelPath()+"upload/"+filename;
//重定向到真实地址(不可用)
//return "redirect:"+RealPath()+"upload/"+filename;
//return "redirect:http://localhost:8080/SpringMvcTest/upload/"+filename;
}
/**
* 多文件上传
* @param request
* @return
*/
@RequestMapping("/multiUpload")
public String multiUpload(HttpServletRequest request){
//1、将请求进行转义
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;
//2、获取同一表单提交过来的所有文件
Map<String, MultipartFile> files = multipartHttpServletRequest.getFileMap();
//3、在真实路径创建文件
File dir = new File(RealPath()+"upload/");
if(!dir.exists()) {
dir.mkdirs();
}
//4、将上传的文件的相对地址保存在一个列表中(客户端只能请求服务器的相对地址)
List<String> fileList = new ArrayList<String>();
for(MultipartFile file : files.values()) {
//5、在服务器的绝对地址下新建文件,并将上传的文件复制过去,将相对路径保存进List列表中,服务器的相对路径和绝对路径是相互映射的,客户端只能请求相对路径
File targetFile = new File(RealPath()+"upload/" + file.getOriginalFilename());
if(!targetFile.exists()) {
try {
targetFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
file.transferTo(targetFile);
fileList.add(RelPath()+"upload/"+file.getOriginalFilename());
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}else{
//文件如果存在直接访问
fileList.add(RelPath()+"upload/"+file.getOriginalFilename());
}
}
System.out.println(fileList);
request.setAttribute("files", fileList);
return "/WEB-INF/jsp/multiUploadResult.jsp";
}
}
图片上传
SpringMVC对多部件类型解析
1.首先需要在页面form表单中提交`enctype="multipart/form-data`的数据。
2.然后需要在springmvc.xml文件中对multipart类型的数据进行解析。
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
3.在pom.xml中添加文件上传的依赖
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
4.创建图片虚拟目录存储图片
直接在tomcat的conf/server.xml文件中添加虚拟路径。
注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。
5.上传图片的前台实现
<tr>
<td>商品图片</td>
<td>
<c:if test="${items.pic !=null}">
<img src="/pic/${items.pic}" width=100 height=100/>
<br/>
</c:if>
<input type="file" name="items_pic"/>
</td>
</tr>
6.上传图片的controller实现
//这里表示修改图片的controller方法
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(
Model model,
HttpServletRequest request,
Integer id,
@ModelAttribute("items")
@Validated(value = ValidGroup1.class)ItemsCustom itemsCustom,
BindingResult bindingResult,
MultipartFile items_pic
)throws Exception {
//原始名称
String originalFilename = items_pic.getOriginalFilename();
//上传图片
if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){
//存储图片的物理路径
String pic_path = "D:\\tmp\\";
//新的图片名称
String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
//新图片
File newFile = new File(pic_path+newFileName);
//将内存中的数据写入磁盘
items_pic.transferTo(newFile);
//将新图片名称写到itemsCustom中
itemsCustom.setPic(newFileName);
}