**
表单上传文件的三要素:
**
- method属性——表单提交方式.
表单上传的方式必须为POST。
由于get请求是把请求参数拼接在请求路径后面,没有独立的请求体,所以有大小限制;但是post请求有单独的请求体,所以没有大小限制。 - enctype属性.
必须设置为:multipart/form-data. - <input>标签.
type属性必须指定为"file",必须有name属性
上传方式一:(传统的方式)
传统的方式:通过request域对象来上传文件。
代码如下:
- 前端代码.
必须包含三要素。
<h3>传统方式上传文件</h3>
<form action="${pageContext.request.contextPath}/file/fileUpLoad" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
- 服务器端代码.
基于SpringMVC框架进行。
@Controller
@RequestMapping("/file")
public class FileController {
/**
* 传统方式 上传文件
* @param request
* @return
*/
@RequestMapping("/fileUpLoad1")
public String fileUpLoad1(HttpServletRequest request)throws Exception{
//获取上传位置的真实路径
String realPath = request.getSession().getServletContext().getRealPath("/loadups/");
System.out.println(realPath);
//创建File对象,一会向该路径下上传文件
File file = new File(realPath);
//判断该目录是否存在
if(!file.exists()){ //该文件夹不存在
file.mkdirs(); //创建文件夹
}
// 创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
// 解析request对象
List<FileItem> items = fileUpload.parseRequest(request);
for (FileItem item : items) {
// 判断文件项是普通字段,还是上传的文件
if(item.isFormField()){
//普通字段项
}else{ //文件项
//获取文件名
String fileName = item.getName();
//把文件的名称唯一化,以防名称一致
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
fileName = uuid+"_"+fileName;
//上传文件
item.write(new File(file,fileName));
//删除临时文件
item.delete();
}
}
return "success";
}
}
- 传统方式完成,可以访问测试
上传方式二:(利用SpringMVC框架)
SpringMVC方式:利用框架自己封装的 MultipartFile 对象来实现。该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同。
代码如下:
- 前端代码.
也是必须包含三要素.
<h3>springmvc方式上传文件</h3>
<form action="${pageContext.request.contextPath}/file/fileUpLoad" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"><br/>
<input type="submit" value="上传">
</form>
- 服务器端代码
基于SpringMVC框架
注意:
参数中的MultipartFile 对象的名字需要与表单中的name属性值一致,否则会上传失败
@Controller
@RequestMapping("/file")
public class FileController {
/**
* springmvc方式 上传文件
* @param request
* @param upload
* @return
* @throws Exception
*/
@RequestMapping("/fileUpLoad")
public String fileUpLoad(HttpServletRequest request, MultipartFile upload)throws Exception{
//获取上传位置的真实路径
String realPath = request.getSession().getServletContext().getRealPath("/loadups/");
System.out.println(realPath);
//创建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";
}
}
- 需要在SpringMVC配置文件中配置文件解析器对象
要求:
id名称必须是 multipartResolver ,其他的名称都不行
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--最大上传的大小-->
<property name="maxUploadSize" value="10485760"/>
</bean>
- 基于SpringMVC框架的方式完成,可以访问测试。
上传方式三:(将文件上传到不同的服务器)
使用前提:
1、需要配置两个tomcat服务器模拟.
2、如果在web.xml文件中配置了过滤器,则需要注意拦截的路径,否则会上传失败
具体步骤:
1、打开tomcat的安装目录,打开conf–>web.xml文件。在图片所示位置配置红色标识的内容,把tomcat的只读关闭。
2、在pom.xml文件中导入需要的坐标
<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、在SpringMVC配置文件中配置文件解析器
要求id名称必须是multipartResolver
<!-- 配置文件解析器对象,要求id名称必须是multipartResolver -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--最大上传的大小-->
<property name="maxUploadSize" value="10485760"/>
</bean>
4、前端代码:
注意三要素.
<form action="user/fileupload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上传文件"/>
</form>
5、服务器端代码
/**
* SpringMVC跨服务器方式的文件上传
*
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value="/fileupload")
public String fileupload3(MultipartFile upload) throws Exception {
System.out.println("SpringMVC跨服务器方式的文件上传...");
// 定义另一个服务器的请求路径
String path = "http://localhost:9090/uploads/";
// 获取到上传文件的名称
String filename = upload.getOriginalFilename();
String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
// 把文件的名称唯一化
filename = uuid+"_"+filename;
// 向图片服务器上传文件
// 创建客户端对象
Client client = Client.create();
// 连接图片服务器
WebResource webResource = client.resource(path+filename);
// 上传文件
webResource.put(upload.getBytes());
return "success";
}