1. 直接使用表单时的文件上传(不使用SpringMVC的接收方式)
首先要在form 表单中的enctype属性设置固定值:multipart/form-data,method属性值必须是post,除此之外,还要有一个文件选择域<input type="file" />;
- 需要用到两个jar包:
commons-fileupload-版本.jar
和commons-io-版本.jar
;
第一步:首先需要一个简单的页面作为前端
<body>
<form method="post" enctype="multipart/form-data" action="acontroller/fileload">
选择文件:<input type="file" name="filed"><br/>
<input type="submit" value="提交">
</form>
</body>
第二步:编写一个后端接收文件的代码
@Controller
@RequestMapping("/acontroller")
public class Acontroller {
@RequestMapping("/fileload")
public String fileupload(HttpServletRequest request) throws FileUploadException {//通过request对象接收
System.out.println("文件上传成功");
//确定好文件上传之后的位置
//这里可以通过下面的方法获得一个String类型的地址,就是类似当前工作空间的地址,加上files目录;
String realPath = request.getSession().getServletContext().getRealPath("/files");
System.out.println(realPath);//看看生成的路径,路径在Tomcat的工作空间里面,反正去服务器的webapps目录下找就可以;
//将这个路径放入到File文件里面
File f = new File(realPath);
//判断文件是否存在
if (!f.exists()) {
f.mkdirs();//这一个方法是创建绝对路径里面的多个目录;
}
//解析前端传过来的文件;
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//对得到的请求进行解析;
List<FileItem> fileItems = upload.parseRequest(request);
//遍历,取得所有的内容
for (FileItem item : fileItems) {
if (item.isFormField()) {//正确则是普通的表单项,否则就是文件;
} else {
//获得文件的名字
String filename = item.getName();
//他不会包含当前的选中的那个字符
filename = filename.substring( filename.lastIndexOf("\\")+1);
//这里取到的文件名总是全路径,导致命名的时候一直报错;(文件名、目录名或卷标语法不正确。)
//也可以对名字进行更新,尽可能设置一个随机的值,防止名字重复;但是这个随机数会将
//含有”-“,文件名里面不好,所以将其全部变成”“
String uuid = UUID.randomUUID().toString().replace("-", "");
//对名字进行重新拼接
filename = uuid + "_" + filename;
try {
//对文件进行写入
item.write(new File(realPath, filename));
} catch (Exception e) {
e.printStackTrace();
} finally {
//对临时文件进行删除;
item.delete();
}
}
}
return "success";
}
}
然后在Tomcat服务器里面的webapps目录下就可以找到这个上传的文件,可以上传;
2. 使用Springmvc框架进行文件的接收
第一步:先配置好文件解析器,当我们没有使用SpringMVC的时候,使用简单的servletAPI,需要自己对文件先解析,然后才能进行处理,但是SpringMVC自带了文件解析器,所以只需要配置就可以了;
<!--配置文件解析器,multipartResolver这个名字好像不能修改,我改了就报错;-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--配置最大的上传内存-->
<property name="maxUploadSize" value="1212121212"/>
</bean>
第二步:接收文件的方法
@RequestMapping("/testuploadfile")
public void testuploadfile(HttpServletRequest request, MultipartFile upload){
System.out.println("文件上传成功");
String path = request.getSession().getServletContext().getRealPath("/files/");
File f = new File(path);
if (!f.exists()) {
f.mkdirs();//这一个方法是创建绝对路径里面的多个目录;
}
//上传文件的名称;
String filename =upload.getOriginalFilename();
filename = filename.substring( filename.lastIndexOf("\\")+1);
String uuid = UUID.randomUUID().toString().replace("-", "");
//对名字进行重新拼接
filename = uuid + "_" + filename;
try {
//对上传的文件进行写入;
upload.transferTo(new File(path,filename));
} catch (IOException e) {
e.printStackTrace();
}
}