一.传统的文件上传
文件上传三要素
<form action="user/fileupload1" method="post" enctype="multipart/form-data">
选择文件<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
java代码的实现
public String fileupload1(HttpServletRequest request) throws Exception {
//getRealPath是从当前servlet 在tomcat 中的存放文件夹开始计算起的
//E:\idea\SpringMvc_02\target\SpringMvc_02\uploads\
//getServletContext获取servlet的上下文引用,一个web工程只有一个
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if (!file.exists()) {
file.mkdirs();//如果不存在则创建文件夹
}
/**创建磁盘文件项工厂
* 当上传的文件项目比较小时,直接保存在内存中(速度比较快),
* 比较大时,以临时文件的形式,保存在磁盘临时文件夹
* (虽然速度慢些,但是内存资源是有限的)。
*/
DiskFileItemFactory factory = new DiskFileItemFactory();
//ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解析request对象
//parseRequest只是从查询字符串和请求体中获取参数赋值到paramMap,然后格式化uri,填充Request对象实例
List<FileItem> list = fileUpload.parseRequest(request);
/**
* ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中,
* 在使用ServletFileUpload对象解析请求时需要根据DiskFileItemFactory对象的属性sizeThreshold(临界值)和repository(临时目录)
* 来决定将解析得到的数据保存在内存还是临时文件中,如果是临时文件,保存在哪个临时目录中?。
* 所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,
*/
for (FileItem fileItem : list) { // 判断文件项是普通字段,还是上传的文件
if (fileItem.isFormField()) {
} else {
// 获取到上传文件的名称
String filename = fileItem.getName();
// 上传文件
fileItem.write(new File(file, filename));
// 删除临时文件
fileItem.delete();
}
}
return "success";
}
3.导入的maven
<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>
二.springmvc的文件上传
2.1xml的配置
<!--配置文件解析器解析request multipartResolver必须是叫这个名字-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
2.2java的代码实现
@RequestMapping("fileupload2")
//upload必须和表单的type为file的name属性一样
public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception{
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if (!file.exists()) {
file.mkdirs();//如果不存在则创建文件夹
}
// 获取到上传文件的名称
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + "_" + filename;
upload.transferTo(new File(path, filename));
return "success";
}
三.跨服务器的文件上传
3.1导入maven坐标
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
</dependencies>
3.2编写java代码
@RequestMapping("/fileupload3")
public String fileupload3(MultipartFile upload) throws Exception {
System.out.println("SpringMVC跨服务器方式的文件上传...");
// 定义图片服务器的请求路径
String path = "http://localhost:9090/day02_springmvc5_02image/uploads/";
// 获取到上传文件的名
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// 把文件的名称唯一化
filename = uuid + "_" + filename;
// 向图片服务器上传文件
// 创建客户端对象
Client client = Client.create();
// 连接图片服务器
WebResource webResource = client.resource(path + filename);
// 上传文件
webResource.put(upload.getBytes());
return "success";
}