javaweb上传文件.docx
- 文档编号:12358211
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:15
- 大小:205.05KB
javaweb上传文件.docx
《javaweb上传文件.docx》由会员分享,可在线阅读,更多相关《javaweb上传文件.docx(15页珍藏版)》请在冰豆网上搜索。
javaweb上传文件
上传文件
3.1、要求
1:
上传文件时,必须要是post类型。
2:
必须是表单
--表单的类型,必须是
表单的默认类型:
Content-type=application/x-www-form-urlencoded
必须要将表单类型修改成:
Content-type=multipart/form-data–多部分/表单字节
则直接在表单中设置enctype=”multpart/form-data”
3:
里面要包含一个:
文件的选择框
以下是一个基本的表单:
请了解上传文件时,HTTP协议的变化:
上传文件时Http协议的变化:
以下是正文:
-----------------------------7dd10711a052c上传的开始
Content-Disposition:
form-data;name="name"
【空行】
澶у濂?
-----------------------------7dd10711a052c又一个新的文件开始了
Content-Disposition:
form-data;name="file";filename="aa.txt"
Content-Type:
text/plain
【空行】
Hello
-----------------------------7dd10711a052c--
3.2、服务器如何获取到数据呢?
1:
通过request.getParmeter获取enctype=multipart/form-data表单中的数据,是获取不到的。
2:
只能通过req.getInputStream–获取到是请求的所有正文。
C以下是代码是自己解析文件上传:
publicclassUpServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)throwsServletException,IOException{
//设置编码
request.setCharacterEncoding("UTF-8");
//测试获取数据
Stringname=request.getParameter("name");
System.err.println("nameis:
"+name);
System.err.println("+====================================");
StringcontentType=request.getHeader("Content-Type");
contentType=contentType.substring(contentType.lastIndexOf("=")+1);
System.err.println("contentTyupeis:
"+contentType);
//获取所有字节数
InputStreamin=request.getInputStream();
//byte[]b=newbyte[1024];
//intlen=0;
//while((len=in.read(b))!
=-1){
//Strings=newString(b,0,len);
//System.err.print(s);
//}
System.err.println("以下是正文:
");
BufferedReaderbr=newBufferedReader(newInputStreamReader(in));
Stringline=null;
br.readLine();
br.readLine();
br.readLine();
br.readLine();
while((line=br.readLine())!
=null){
if(!
line.contains(contentType)){
System.err.println(line);
}
}
}
}
3.3、用第三方组件实现文件上传
组件名称
说明
公司
fileupload
用的最多,集成到struts中,重点。
Apache-1.2,3
cos
性能最快,struts支持配置的cos.
Orialliy=>0.9
jspsmartupload
200M以上直接崩溃。
3.4、用fileupload实现文件上传
将jar包放到lib目录下
Fileupload的核心类:
DiskfileItemFactory:
设置文件上传时的缓冲区大小和临时目录。
ServletFileUpload:
上传核心文件,用于解析request。
从reqeust中解析出每一个File对象。
示例:
第一步:
开发一个Servlet
第二步:
创建一个保存文件的目录
第三步:
开发页面
3.5、对上传的代码进行优化
3.6、上传多个文件
就是在后台
List
遍历fis就可以了。
第一步:
先开发界面:
第二步:
开发Up3Servlet
第三步:
封装上传的所有文件信息
名称,大小,类型
try{
ServletFileUploadup=newServletFileUpload(disk);
List
Stringsavepath=getServletContext().getRealPath("/up");
//声明一个集合,用于保存所有上传的文件信息
List
for(FileItemf:
fs){
//获取文件名
StringfileName=f.getName();
FileUtils.copyInputStreamToFile(f.getInputStream(),newFile(
savepath+"/"+fileName));
//每次一个新的map
Map
map.put("fileName",fileName);
map.put("size",f.getSize());
map.put("type",f.getContentType());
ups.add(map);
f.delete();
}
//转发到
request.setAttribute("ups",ups);
request.getRequestDispatcher("/jsps/show.jsp").forward(request,response);
}catch(Exceptione){
e.printStackTrace();
}
第四步:
3.6、上传图片时解决重名问题-同时可以解决显示图片的问题
//对文件修改名称,保存扩展名
StringextName=fileName.substring(fileName.lastIndexOf("."));
Stringuuid=UUID.randomUUID().toString().replace("-","");
StringnewFileName=uuid+extName;
FileUtils.copyInputStreamToFile(f.getInputStream(),newFile(
savepath+"/"+newFileName));
//每次一个新的map
Map
map.put("fileName",fileName);
map.put("size",f.getSize());
map.put("type",f.getContentType());
//保存新的名称
map.put("newName",newFileName);
ups.add(map);
3.7、上传文件时,能不能说明
mons.fileupload
InterfaceFileItem
第一步:
开发一个页,带有说明的上传
第二步:
开发Servlet
publicclassUp4ServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
request.setCharacterEncoding("UTF-8");
DiskFileItemFactorydisk=newDiskFileItemFactory();
disk.setSizeThreshold(1024*10);
Filefile=newFile("d:
/b");
if(file.exists()){
disk.setRepository(file);
}
try{
ServletFileUploadup=newServletFileUpload(disk);
List
Stringsavepath=getServletContext().getRealPath("/up");
Map
//遍历且判断是否是文件
for(FileItemf:
fs){
if(f.isFormField()){
//则获取到它的文本的内容
Stringdesc=f.getString("UTF-8");
System.err.println("说明是:
"+desc);
mm.put("desc",desc);
}else{
StringfileName=f.getName();
FileUtils.copyInputStreamToFile(f.getInputStream(),
newFile(savepath+"/"+fileName));
mm.put("name",fileName);
mm.put("size",f.getSize());
}
}
//放到req
request.setAttribute("mm",mm);
request.getRequestDispatcher("/jsps/show2.jsp").forward(request,response);
}catch(Exceptione){
e.printStackTrace();
}
}
}
3.7、上传多个都带说明的
代码:
List
//声明一个map
Map
for(FileItemfi:
fs){
if(fi.isFormField()){
Stringdesc=fi.getString("UTF-8");
mm.put("desc",desc);
//放到list
list.add(mm);
}else{
StringfileName=fi.getName();
FileUtils.copyInputStreamToFile(fi.getInputStream(),
newFile(savepath+"/"+fileName));
mm=newHashMap
mm.put("name",fileName);
mm.put("size",fi.getSize());
}
}
//放到req
request.setAttribute("list",list);
request.getRequestDispatcher("/jsps/show2.jsp").forward(request,response);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- javaweb 上传 文件