首先是基于spring框架,在springMVC-servlet.xml中配置multipart类型解析器,具体配置如下:
<!-- 设置上传文件最大值 1M=1*1024*1024(B)=1048576 bytes -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576" />
</bean>
其配置了一个多类型文件解析器CommonsMultipartResolver,并配置了maxUploadSize属性,设置上传文件占用的最大容量。
当然,使用springMVC上传文件需要用到Apache开源上传软件包fileupload和io包,并将这两个包依赖引入工程。如下图:
附上这两个jar的链接:https://pan.baidu.com/s/1Qs32eGzjcuieh8HjveQiLQ 密码:p8gj
之后在controller层增加上传文件的接口,这里以图片为例。
/**
* 上传图片
*/
@RequestMapping(value = "/touploadImg")
public String touploadImg(Model model) throws Exception{
return "/two";//上传路劲
}
/**
* 上传图片
*/
@RequestMapping(value = "/uploadImg")
public static String uploadImg(Model model,MultipartFile file) throws Exception {
String aa = file.getOriginalFilename();
aa = new String(aa.getBytes("ISO-8859-1"),"UTF-8");//转码
String bb=null;
if(file!=null&&aa!=null&&aa.length()>0){
String path = "G:\\cesh\\";//文件放置的文件夹
File file1 = new File(path);
if(!file1.exists()){//判断文件目录是否存在,不在则新增
file1.mkdirs();
}
// bb=System.currentTimeMillis()+aa.substring(aa.lastIndexOf("."));
bb=System.currentTimeMillis()+aa;//以时间戳加图片名的方式存储图片
System.out.println(bb);
File newfile = new File(path+bb);
file.transferTo(newfile);
}
model.addAttribute("image",bb);//回显刚刚上传的图片名称
return "/two"; //重回上传页面
}
前端two.jsp的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="fn"
uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="utf-8">
<title>上传图片测试</title>
</head>
<body>
<form action="uploadImg.action" method="post" enctype="multipart/form-data">
<c:if test="${image !=null }">
<img src="/cesh/${image }" width=100 height=100/><br/>
</c:if>
<input type="file" name="file"/><br/>
<input type="submit" value="上传">
</form>
</body>
</html>
注:这里返回的图片路径应该在tomcat中配置,不然是显示404找不到该图片路径的。
即在tomcat目录下的conf文件夹下的server.xml配置文件,在最下方的Host标签中添加以下配置:
<Context docBase="G:\upload" path="/cesh" reloadable="false"/>
这里配置了当访问“/cesh”路径时,映射提供服务机器G盘的upload文件夹所在的目录。
测试:启动测试工程,在浏览器中输入http://localhost:8080/Spring_test/touploadImg.action跳转图片上传页面。如下:
上传成功后可以在G:/upload下找到刚刚上传的图片。
附:文件或目录的删除:
/**
* 删除单个文件
*
* @param fileName
* 要删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
/**
* 删除目录及目录下的文件
*
* @param dir
* 要删除的目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDirectory(String dir) {
// 如果dir不以文件分隔符结尾,自动添加文件分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir对应的文件不存在,或者不是一个目录,则退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
System.out.println("删除目录失败:" + dir + "不存在!");
return false;
}
boolean flag = true;
// 删除文件夹中的所有文件包括子目录
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 删除子文件
if (files[i].isFile()) {
flag = deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 删除子目录
else if (files[i].isDirectory()) {
flag = deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("删除目录失败!");
return false;
}
// 删除当前目录
if (dirFile.delete()) {
System.out.println("删除目录" + dir + "成功!");
return true;
} else {
return false;
}
}
编写一个主方法做测试用:
public static void main(String [] args) throws UnsupportedEncodingException{
String fileName="G:\\upload";
File file = new File(fileName);
if (!file.exists()) {
System.out.println("删除文件失败:" + fileName + "不存在!");
} else {
if (file.isFile())
deleteFile(fileName);
else
deleteDirectory(fileName);
}
}