提前配置好spring的前端控制器及视图解析器。
传统的java文件上传
依赖的jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
提交文件的表单
将提交方式改为post,并且将enctype类型改为multipart/form-data
<h1>传统方式上传文件</h1>
<form action="user/uploadFile" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br>
<input type="submit" value="上传文件">
</form>
控制器处理请求并上传文件
@RequestMapping("/uploadFile")
public String testUploadFile(HttpServletRequest request) throws Exception {
System.out.println("开始上传文件");
// 获取要上传文件的目录
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
// 创建File对象,一会向该路径下传送文件
File file = new File(realPath);
// 判断路径是否存在,如果不存在创建该目录
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";
}
使用tomcat运行,最终将文件上传到了tomcatWebapp文件下的该项目的工作目录。
SpringMVC方式的上传文件
springmvc可以配置文件解析器,来替代传统的创建文件项工厂、
遍历解析request对象过程,这些springmvc的文件解析器会帮我们做。
第一步配置文件解析器
<!-- 配置文件解析器,要求id名称必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件最大内存 -->
<property name="maxUploadSize" value="10485760"></property>
</bean>
提交文件的表单
<h1>SpringMVC方式上传文件</h1>
<form action="user/uploadFile2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br>
<input type="submit" value="上传文件">
</form>
控制器处理请求并提交文件
@RequestMapping("/uploadFile2")
public String testUploadFileMvc(HttpServletRequest request, MultipartFile upload) throws Exception {
// 获取要上传文件的目录
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
// 创建File对象,一会向该路径下传送文件
File file = new File(realPath);
// 判断路径是否存在,如果不存在创建该目录
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";
}
跨服上传文件到服务器
前面做的都是上传到本地的服务器,现在再建一个项目设置tomcat为8081端口,相当于用8080端口运行的项目,将文件传送到8081端口。8081服务器不需要设置什么,创建个Meaven项目选怎webapp皆可以了。
引入maven坐标
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.4</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.4</version>
</dependency>
表单
<h1>SpringMVC方式上传到图片服务器</h1>
<form action="user/uploadFile3" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br>
<input type="submit" value="上传文件">
</form>
控制器处理请求并上传到8081服务器
@RequestMapping("/uploadFile3")
public String testUploadFileService(MultipartFile upload) throws Exception {
System.out.println("向服务器上传文件");
// 定义图片服务器的请求路径
String path = "http://localhost:8081/uploadService_war_exploded/";
// 获取上传文件名称
String filename = upload.getOriginalFilename();
// 防止重名文件覆盖,重新生成文件名称唯一化
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
filename = uuid+"_"+filename;
// 向图片服务器上传文件
// 创建客户端对象
Client client = Client.create();
// 连接图片服务器
WebResource resource = client.resource(path + filename);
// 上传文件
System.out.println("准备上");
resource.put(upload.getBytes());
return "success";
}
如果报错405,需要将tomcat目录下conf/web.xml,设置只读false,在指定位置加上下面一段配置。
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
这个文件会发送到项目目录target目录下。