页面的上传文件,到后台需对form表单进行设置
需要设置三个属性
- 上传框要有name属性
- 表单的method必须是post
- 表单的enctype属性必须是 multipart/form-data
表单中的entype属性有默认值,enctype="application/x-www-form-urlencoded",不写的情况下默认。---这个值是url表单
使用上传必须将这个值修改为 enctype="multipart/form-data"---这个值是多部分表单
url(普通)表单
以url形式进行数据拼装传递的表单
多部分表单
------------------------------------xxxxx
一部分
-----------------------------------xxxxx
一部分
------------------------------------xxxxx
一部分
不论是url(普通)表单还是多部分表单,数据都在请求体
注意:如果是多部分的表单进行提交,之前使用的request获取数据的3种方式,全部失效
接收方式:
原理:使用request.getInputStream(); //对流中数据拆分,工作中不会使用,因为太复杂
使用上传工具包:
1、导入jar包
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
2、在servlet中使用方法
//创建一个磁盘文件工厂--需要通过它产生核心上传对象
DiskFileItemFactory disk = new DiskFileItemFactory();---导入的包下
//生成核心的上传对象---需要它解析request---传入上传对象
ServletFileUpload sfu = new ServletFileUpload(disk);
//解析request
List<FileItem> list = sfu.parseRequest(request);
//遍历所有的表单项
for (FileItem item : list){
//判断是普通的表单项还是上传的表单项 item.isFormField(): true:普通的表单项 false:上传的表单项
if(item.isFormField()){
//普通的表单项 name value
String name=item.getFieldName();//获取表单属性名
String value=item.getString("utf-8");//获取表单属性值
}else{
// 上传表单项 文件名 内容
String filename = item.getName();//获取上传文件的文件名
InputStream is = item.getInputStream(); //文件内容
// 放在服务器上
String path = this.getServletContext().getRealPath("");//获取项目在磁盘的位置
FileOutputStream os = new FileOutputStream(path+"/upload/"+filename);//获取文件输出流
IOUtils.copy(is, os);//使用commons-io-1.4.jar中的copy方法,将上传文件的流转换为输出流,并将文件保存在本地
}
}
注:因为该文件是保存在下的,每次项目从新部署都会将文件销毁,解决办法:项目备份,或者保存在项目外的磁盘位置