小编一路学习过来整理了文件上传的演化过程,随着框架的使用,使得文件上传的过程越来越简化方便,也正是因为框架的帮助,使得开发更加的简洁,下面小编整理了整个文件上传的变化过程!
跨服务器方式文件上传
- 1)、普通文件上传
- 2)、SpringMVC文件上传
- 3)、跨服务器文件上传
- 1).文件上传逻辑图
- 2).导入jersey坐标,用来实现跨服务器上传
- 3).跨服务器代码实现
- 4).可能会出现的异常
- 5).最终效果图
1)、普通文件上传
1.普通文件上传代码如下
@RequestMapping("/testFileUp")
public String testFileUp(HttpServletRequest request) throws Exception {
// 获取原生真实路径
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
//创建文件 , 判断是否存在此文件夹
File file = new File(realPath);
if(!file.exists()){
boolean mkdirs = file.mkdirs();
System.out.println("isCreating? "+mkdirs);
}
//打印文件地址便于查看
System.out.println("file exitst ..." + realPath);
//配置DiskFile工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//使用Servlet
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//解析request
List<FileItem> items = fileUpload.parseRequest(request);
//判断文件是什么类型的
for (FileItem item : items)
if (item.isFormField()) {
//普通类型
String name = item.getFieldName();
if (name.equals("name")) {
//输出表单字段的值
System.out.print(item.getString("UTF-8")+"上传了文件。");
}
} else {
System.out.println("文件字段");
//文件类型
//1.获取文件名字
String name = item.getName();
//添加一个随机值与文件名拼串
String s = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
//拼串
name = s+"_"+name;
//上传文件
item.write(new File(realPath, name));
//删除零食文件
item.delete();
}
return "success";
}
2)、SpringMVC文件上传
@RequestMapping("/testFileUp2")
public String testFileUp2(HttpServletRequest request, MultipartFile filename) throws Exception {
//原生实现文件上传
// 获取原生真实路径
String realPath = request.getSession().getServletContext().getRealPath("/uploads/");
//创建文件 , 判断是否存在此文件夹
File file = new File(realPath);
if(!file.exists()){
boolean mkdirs = file.mkdirs();
System.out.println("isCreating?"+mkdirs);
}
System.out.println("file exitst ..." + realPath);
//获取到上传文件的名称 == item.getFileName()
String name = filename.getOriginalFilename();
String s = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
name = s+"_"+name;
//上传文件
filename.transferTo(new File(realPath,name));
return "success";
}
- 补充:SpringMVC提供了了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同
- 可以通过配置配置文件的方式限制文件上传限制(ID必须为multipartResolver)
<!-- 配置文件管理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="#{1024 * 10 * 100}"/>
</bean>
3)、跨服务器文件上传
1).文件上传逻辑图
2).导入jersey坐标,用来实现跨服务器上传
<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).跨服务器代码实现
@RequestMapping("/testFileUp3")
public String testFileUp3( MultipartFile upload) throws Exception {
//自定义路径
String path = "http://localhost:9090/uploads/";
//获取文件名
String name = upload.getOriginalFilename();
String s = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
name = s+"_"+name;
//创建客户端对象
Client client = new Client();//com.sun.jersey.api.client.Client; 注意是jerse包下的Client
//连接图片服务器
WebResource webResource = client.resource(path + name);//因为path后面加了 ‘/ ’ 所以这里直接拼接就行了
//上传文件
webResource.put(upload.getBytes());//提交字节上传文件
return "success";
}
4).可能会出现的异常
1)、403:return a response status of 403 Forbidden
原因:在tomcat中,是由于"写入"访问被禁止而造成的,当试图将文件上载到目录或在目录中修改文件,但该目录不允许"写"访问时就会出现此种错误。解决:修改为可接受传入即可,即将value改为false
2)、500:org.springframework.web.multipart.MaxUploadsSizeExceedException
原因:小编之前定义的最大上传文件大小字节为1024*1000所以只有1024000个字节大小,但是图片的大小为1314599个字节大小,所以上传就没有成功,所以这个异常修改上传最大字节即可解决:修改最大值即可
5).最终效果图
上传成功!