使用表单进行文件上传
1. form的method属性提交方式: post
2. form 的enctype属性:
enctype的默认值: application/x-www-form-urlencoded对表单数据进行url编码->对文本进行编码
中:(UTF-8)占3个字节-> url编码:每一个字节变成: %两位十六进制
类似于这种形式:%17%AB%E7
multipart/form-data->多部件表单数据 针对文件
3.使用表单子元素:`
1.添加jar包 添加commons-fileupload.jar: commons-io.jar 到web-inf里面的lib
2.编写servlet来接收前端请求 前端有请求参数 现在还是用request.getParameter来接收吗?
如果我们的表单enctype设置为'multipart/form-data',此时request.getParamter()这一类方法都失效,获取不到请求参数
获取请求参数借助导入commos-fileUpload代码
commos-fileUpload编码的步骤:
1.创建解析器工程对象:DiskFileltemFactory ->直接new
DiskFileItemFactory factory = new DiskFileItemFactory()
2.根据Fileltem工厂对象得到解析器: ServletFileUpload
ServletFileUpload fileUpload = new ServletFileUpload(factory)
3.使用解析器来解析request对象,得到Fileltem集合
List
list = fileUpload .parseRequest( request) Fileltem:表单项,就是前端form表单中表单子元素: input.selected,textarea等等
分类:文件域(type=file),非文件域(普通表单子元素)
遍历Fileltem集合,得到每一个Fileltem,判断是否是文件域还是非文件域,如果文件域进行文件上传,非文件域:得到value
文件上传
1.改servelt代码upload.jsp -> test
UploadServlet.java
doPost(){
DiskFileItem factory = new DiskFileItemFactory();
Servlet fileUpload = new ServletFileUpload(factory);
try{
List fileItem = fileUpload.parseRequest(request);
for(FileItem fileItem : fileItems){
//判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域
sout(fileItem.isFormField());
if(fileItem.isFormField()){
//获取请求参数名 getFieldName() 请求参数值 getString(String encoding)
sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));
}else{
//获得提交过来的文件的文件名
sout("上传的文件名:" + fileItem.getName());
}
}
}catch(fileUploadException e){
e.printStackTrace();
}
}
适应IO流的替换,->void write(File file) throw Exception;封装了这个适应IO流的实现code
文件上传
1.改servelt代码upload.jsp -> test
UploadServlet.java
doPost(){
DiskFileItem factory = new DiskFileItemFactory();
Servlet fileUpload = new ServletFileUpload(factory);
try{
List
fileItem = fileUpload.parseRequest(request); for(FileItem fileItem : fileItems){
//判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域
sout(fileItem.isFormField());
if(fileItem.isFormField()){
//获取请求参数名 getFieldName() 请求参数值 getString(String encoding)
sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));
}else{
//获得提交过来的文件的文件名
sout("上传的文件名:" + fileItem.getName());
//上传文件
File savePathfile = new File("D:\\StorFileDir");//保存路径
//判断文件夹是否存在
if(!savePathfile.exits()){//不存在 ->防止文件夹不存在
savefile.mkdirs();
}
File savefile = new File(savePathfile,fileItem.getName());
fileItem.write(savefile);
}
}
}catch(fileUploadException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
有个问题?上传的名字冲突问题
/使用客户端上传的文件名作为服务器保存的文件名,可能多个客户端使用相同名字,造成覆盖文件
//需要你实现服务器自动生成不重复的文件名
服务器自动生成不重复的文件名 时间戳(毫秒)+区分名 java的工具类:可以随机生成UUID 是一个算法 或者使用雪花算法
long time = System.currentTimeMillis();
//加上后缀名 要求后缀名与上传的文件名的后缀名是一样的 xxx.jpg
String fileName = fileItem.getItem();
String suffix = fileName.substring(fileName.lastIndexOf("."));
File savefile = new File(savePathfile,time+suffix);
UploadServlet.java
doPost(){
DiskFileItem factory = new DiskFileItemFactory();
Servlet fileUpload = new ServletFileUpload(factory);
try{
List
fileItem = fileUpload.parseRequest(request); for(FileItem fileItem : fileItems){
//判断是否是文件域isFormField()返回true表示普通表单项 false则是文件域
sout(fileItem.isFormField());
if(fileItem.isFormField()){
//获取请求参数名 getFieldName() 请求参数值 getString(String encoding)
sout("参数名:" + fileItme.getFieldName() + ",值:" + fileItem.getString("UTF-8"));
}else{
//获得提交过来的文件的文件名
sout("上传的文件名:" + fileItem.getName());
//上传文件
File savePathfile = new File("D:\\StorFileDir");//保存路径
//判断文件夹是否存在
if(!savePathfile.exits()){//不存在 ->防止文件夹不存在
savefile.mkdirs();
}
long time = System.currentTimeMillis();
//加上后缀名 要求后缀名与上传的文件名的后缀名是一样的 xxx.jpg
String fileName = fileItem.getItem();
String suffix = fileName.substring(fileName.lastIndexOf("."));
File savefile = new File(savePathfile,fileItem.getName());
fileItem.write(savefile);
}
}
}catch(fileUploadException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
第二种:UUID的方式
String time = UUID.randomUUID().toString();//生成小写加-分割
String fileName = fileItem.getName();
String suffix = fileName.subString(fileName.lastindexOf(".));
File saveFile = new File(savePathFile,time+suffix);
fileItem.write(saveFile);
优化:去掉-
String time = UUID.randomUUID().toString().toUpperCaea().replace("-","");