传统Servlet方式上传文件
前端页面:
注意要设置表单enctype属性:
enctype=“multipart/form-data”
(将数据以多段的形式发送)。
enctype : 属性规定在发送到服务器之前应该如何对表单数据进行编码。
multipart/form-data : 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
<form action="user/fileupload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
</form>
后端处理:
- 获取目标存放目录,不存在则创建
- 获取servlet上传文件工具
- 解析Request域,获取List < FileItem > 对象
- 每个FileItem存着表单每一项的具体信息
- FileItem通过流的形式写出,并释放
/**
* 文件上传
* @throws Exception
*/
@RequestMapping(value="/fileupload")
public String fileupload(HttpServletRequest request) throws Exception {
// 先获取到要上传的文件目录
String path = request.getSession().getServletContext().getRealPath("/uploads");
// 创建File对象,一会向该路径下上传文件
File file = new File(path);
// 判断路径是否存在,如果不存在,创建该路径
if(!file.exists()) {
file.mkdirs();
}
// 创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解析request对象
List<FileItem> list = fileUpload.parseRequest(request);
// 遍历
for (FileItem fileItem : list) {
// 判断文件项是普通字段,还是上传的文件
if(fileItem.isFormField()) {
//...
}else {
// 上传文件项// 获取到上传文件的名称
String filename = fileItem.getName();
// 上传文件
fileItem.write(new File(file, filename));
// 删除临时文件
fileItem.delete();
}
}
return "success";
}
SpringMVC上传文件
springMVC直接将request对象解析这一步骤通过前端控制器调用文件解析器帮我们做了,直接传递了一个MultipartFile对象给我们,MultipartFile封装着文件内容。
1. 文件解析器,id名称必须是multipartResolver
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
2. 前端也同样需要设置表单enctype属性:
enctype=“multipart/form-data”
<form action="upload" method="post" enctype="multipart/form-data">
<input name="name" value="eddie"><br/>
选择文件:<input type="file" name="upload"><br/>
<input type="submit">
</form>
3. 后端:
/**
* SpringMVC方式的文件上传
*
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value="/fileupload")
public String fileupload(HttpServletRequest request, @RequestParam("upload")MultipartFile upload) throws
Exception {
System.out.println("SpringMVC方式的文件上传...");
// 先获取到要上传的文件目录
String path = request.getSession().getServletContext().getRealPath("/uploads");
// 创建File对象,一会向该路径下上传文件
File file = new File(path);
// 判断路径是否存在,如果不存在,创建该路径
if(!file.exists()) {
file.mkdirs();
}
// 获取到上传文件的名称
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// 把文件的名称唯一化
filename = uuid+"_"+filename;
// 上传文件
upload.transferTo(new File(file,filename));
return "success";
}
跨服务器存储文件
跨服务器需要的jar包
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version></version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version></version>
</dependency>
步骤:
- 把Path目录设置为图片存储服务器的文件目录
// 定义图片服务器的请求路径
String path = "http://localhost:8080/fileServer/uploads/";
- 通过WebResource和Client上传文件
// 创建客户端对象
Client client = Client.create();
// 连接图片服务器
WebResource webResource = client.resource(path+filename);
// 上传文件
webResource.put(upload.getBytes());