👉 原文首发: 小牛肉的个人博客,欢迎来访~
文章目录
一、传统方式的文件上传
传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。 并且上传完成之后,浏览器可能跳转。
1. 导入依赖
<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>
2. Jsp界面
<form action="/fileupload" method="post" enctype="multipart/form-data">
<input type="file" name = "upload"/>
<br/>
<input type="submit" value="上传文件">
</form>
3. Controller控制器
//控制器类
@Controller
public class FileController {
@RequestMapping("/fileupload")
public String fileupload(HttpServletRequest request) throws Exception {
// 先获取到要上传的文件目录
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 创建File对象,一会向该路径下上传文件
File file = new File(realPath);
// 判断路径是否存在,如果不存在,创建该路径
if(!file.exists()){
file.mkdirs();
}
// 创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// 解析request对象
List<FileItem> list = servletFileUpload.parseRequest(request);
// 遍历
for(FileItem fileItem : list){
// 判断文件项是普通字段,还是上传的文件
if(fileItem.isFormField()){
}
// 上传文件项
else{
// 获取到上传文件的名称
String filname = fileItem.getName();
// 上传文件
fileItem.write(new File(file,filname));
// 删除临时文件
fileItem.delete();
}
}
return "success";
}
}
4. 运行结果
文件会上传到 target
目录下的 uploads 文件夹
二、 SpringMVC传统方式的文件上传
同样需要导入上一步的pom依赖文件
原理如下:
1. 配置文件解析器
springmvc.xml
<!-- 配置文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为 5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意: 文件上传的解析器 id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他 字段也将无法绑定)
2. Jsp界面
<form action="/fileUpload2" method="post" enctype="multipart/form-data">
名称:<input type="text" name="picname"/><br/>
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value=" 上传 "/>
</form>
3. Controller控制器
@RequestMapping("/fileUpload2")
// 参数picname、uploadFile要和jsp界面的name一致
public String FileUpload2(String picname, MultipartFile uploadFile, HttpServletRequest request) throws IOException {
// 1. 定义文件名
String fileName = "";
// 获取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
// 截取文件扩展名
String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
// 把文件加上随机数,防止文件重复
String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
// 判断是否输入了文件名
if(!StringUtils.isEmpty(picname)){
fileName = uuid + "_" + picname + "." + extendName;
}
else{
fileName = uuid + "_" + uploadFileName;
}
System.out.println(fileName);
// 2. 获取到要上传的文件目录
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 3. 创建File对象,一会向该路径下上传文件
File file = new File(realPath);
// 判断路径是否存在,如果不存在,创建该路径
if(!file.exists()){
file.mkdirs();
}
// 4. 使用 MulitpartFile 接口中方法,把上传的文件写到指定位置
uploadFile.transferTo(new File(file, fileName));
return "success";
}
4. 运行结果
三、SpringMVC跨服务器方式的文件上传
此处我们用两个 Tomcat 服务器模拟应用服务器和图片服务器
1. 新建一个Tomcat服务器存储图片
新建一个 fileuploadserver web工程
在webapp 下创建uploads文件夹用来存储图片
同时需要在target目录下创建uploads文件夹(这一步很重要,不做的话会报409错误)
Tomcat 服务器配置,注意修改端口号
还需要在web.xml中修改serlvet权限,servlet默认权限是只读 (这步不做会报405错误)
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
org.apache.catalina.servlets.DefaultServlet
会爆红,不用理会,我们只需要能够修改权限就可以了
OK,至此,图片服务器 fileupload 的配置完毕,接下来开始应用服务器 springmvc 的配置和代码编写
2. 导入依赖
<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>
3. Jsp界面
<form action="/fileUpload3" method="post" enctype="multipart/form-data">
图片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value=" 上传 "/>
</form>
4. Controller控制器
@RequestMapping(value = "/fileUpload3")
// 参数picname、uploadFile要和jsp界面的name一致
public String FileUpload3(MultipartFile uploadFile) throws IOException {
System.out.println("SpringMVC跨服务器方式的文件上传......");
//定义图片服务器的请求路径
String path = "http://localhost:9090/uploads/";
//获取到上传文件的名称
String filename = uploadFile.getOriginalFilename();
// 把文件加上随机数,防止文件重复
String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
// 文件名称唯一化
filename = uuid + "_" + filename;
//向图片服务器上传文件
// 1. 创建客户端对象
Client client = Client.create();
// 2. 连接图片服务器
WebResource resource = client.resource(path + filename);
// 3. 上传文件
resource.put(uploadFile.getBytes());
return "success";
}
5. 运行结果
最终图片保存在 图片服务器 的 target 文件夹下的 uploads 中