1 文件上传的回顾
1.1 文件上传的必要前提
- form表单的enctype是表单请求正文的类型,取值必须是
multipart/form-data(默认值是application/x-www-form-urlencoded); - method属性取值必须是
post; - 提供一个文件选择域
<input type=”file” />。
1.2 文件上传的原理分析
-
当
enctype="application/x-www-form-urlencoded"时:form表单的正文内容是key=value&key=value&key=value; -
当
enctype="Mutilpart/form-data"时:enctype取值不是默认值时,request.getParameter()将失效。每一部分都是MIME类型描述的正文,form表单的正文内容就变成:-----------------------------7de1a433602ac //分界符 Content-Disposition: form-data; name="userName" //协议头 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa //协议的正文 -----------------------------7de1a433602ac Content-Disposition: form-data; name="file"; filename="C:\Users\zhy\Desktop\fileupload_demofile\b.txt" Content-Type: text/plain 协议的类型(MIME 类型) bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
1.3 借助第三方组件实现文件上传
使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。
commons-io不属于文件上传组件的开发jar文件,但Commons-fileupload组件从1.1版本开始需要commons-io包的支持。

2 Spring MVC传统文件上传
2.1 说明
传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。并且上传完成之后,浏览器可能跳转。
2.2 实现步骤
-
导入文件上传的jar包:

-
jsp页面表单:
<form action="/fileUpload" method="post" enctype="multipart/form-data"> 名称:<input type="text" name="picname"/><br/> 图片:<input type="file" name="uploadFile"/><br/> <input type="submit" value="上传"/> </form> -
控制器代码:
/** * 文件上传的的控制器 */ @Controller("fileUploadController") public class FileUploadController { /** * 文件上传 */ @RequestMapping("/fileUpload") public String testResponseJson(String picname,MultipartFile uploadFile,HttpServletRequest request) throws Exception{ //一、定义文件名 String fileName = ""; //1.获取原始文件名 String uploadFileName = uploadFile.getOriginalFilename(); //2.截取文件扩展名 String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1, uploadFileName.length()); //3.把文件加上随机数,防止文件重复 String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase(); //4.判断是否输入了文件名 if(!StringUtils.isEmpty(picname)) { fileName = uuid+"_"+picname+"."+extendName; } else { fileName = uuid+"_"+uploadFileName; } System.out.println(fileName); //二、获取文件路径 ServletContext context = request.getServletContext(); String basePath = context.getRealPath("/uploads"); //三、解决同一文件夹中文件过多问题 String datePath = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //四、判断路径是否存在 File file = new File(basePath+"/"+datePath); if(!file.exists()) { file.mkdirs(); } //五、使用MulitpartFile接口中方法,把上传的文件写到指定位置 uploadFile.transferTo(new File(file,fileName)); return "success"; } } -
配置文件解析器:
<!-- 配置文件上传解析器,id的值是固定的 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>注意:文件上传的解析器id是固定的,不能起别的名称,否则无法实现请求参数的绑定。(不光是文件,其他字段也将无法绑定)
3 Spring MVC跨服务器文件上传
3.1 分服务器的目的
在实际开发中,我们会有很多处理不同功能的服务器(此处说的不是服务器集群),例如:
- 应用服务器:负责部署我们的应用;
- 数据库服务器:运行我们的数据库;
- 缓存和消息服务器:负责处理大并发访问的缓存和消息;
- 文件服务器:负责存储用户上传文件的服务器。
分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

3.2 实现步骤
-
创建两个Tomcat服务器:



-
创建一个用于存放图片的Web工程:

-
文件服务器的Tomcat中配置“允许读写操作”:
- 修改文件位置:

- 加入内容:

加入此行的含义:接收文件的目标服务器可以支持写入操作。
- 修改文件位置:
-
拷贝jar包:在我们负责处理文件上传的项目中拷贝文件上传的必备jar包。


-
编写控制器实现上传图片:
/** * 响应json数据的控制器 */ @Controller("fileUploadController2") public class FileUploadController2 { public static final String FILESERVERURL = "http://localhost:9090/day06_spring_image/uploads/"; /** * 文件上传,保存文件到不同服务器 */ @RequestMapping("/fileUpload2") public String testResponseJson(String picname,MultipartFile uploadFile) throws Exception{ //定义文件名 String fileName = ""; //1.获取原始文件名 String uploadFileName = uploadFile.getOriginalFilename(); //2.截取文件扩展名 String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1, uploadFileName.length()); //3.把文件加上随机数,防止文件重复 String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase(); //4.判断是否输入了文件名 if(!StringUtils.isEmpty(picname)) { fileName = uuid+"_"+picname+"."+extendName; } else { fileName = uuid+"_"+uploadFileName; } System.out.println(fileName); //5.创建sun公司提供的jersey包中的Client对象 Client client = Client.create(); //6.指定上传文件的地址,该地址是web路径 WebResource resource = client.resource(FILESERVERURL+fileName); //7.实现上传 String result = resource.put(String.class,uploadFile.getBytes()); System.out.println(result); return "success"; } } -
编写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> -
配置解析器:
<!-- 配置文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
3295

被折叠的 条评论
为什么被折叠?



