jsp实现文件上传和下载代码及说明.docx
- 文档编号:26236642
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:10
- 大小:18.07KB
jsp实现文件上传和下载代码及说明.docx
《jsp实现文件上传和下载代码及说明.docx》由会员分享,可在线阅读,更多相关《jsp实现文件上传和下载代码及说明.docx(10页珍藏版)》请在冰豆网上搜索。
jsp实现文件上传和下载代码及说明
特点:
1.可以多文件上传;
2.返回上传后的文件名;
3.form表单中的其他参数也可以得到。
先贴上传类,JspFileUpload
packagecom.vogoal.util;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.Hashtable;
importjavax.servlet.ServletInputStream;
importjavax.servlet.http.HttpServletRequest;
/*
*vogoalAPI1.0
*AutherSinNeR@
*by
*mail:
vogoals@
*/
/**
*JSP上传文件类
*
*@authorSinNeR
*@version1.0
*/
publicclassJspFileUpload{
/**request对象*/
privateHttpServletRequestrequest=null;
/**上传文件的路径*/
privateStringuploadPath=null;
/**每次读取得字节的大小*/
privatestaticintBUFSIZE=1024*8;
/**存储参数的Hashtable*/
privateHashtableparamHt=newHasptable();
/**存储上传的文件的文件名的ArrayList*/
privateArrayListupdFileArr=newArrayList();
/**
*设定request对象。
*
*@paramrequest
* HttpServletRequestrequest对象
*/
publicvoidsetRequest(HttpServletRequestrequest){
this.request=request;
}
/**
*设定文件上传路径。
*
*@parampath
* 用户指定的文件的上传路径。
*/
publicvoidsetUploadPath(Stringpath){
this.uploadPath=path;
}
/**
*文件上传处理主程序。
�������B
*
*@returnint操作结果0文件操作成功;1request对象不存在。
2没有设定文件保存路径或者文件保存路径不正确;3
* 没有设定正确的enctype;4文件操作异常。
*/
publicintprocess(){
intstatus=0;
//文件上传前,对request对象,上传路径以及enctype进行check。
status=preCheck();
//出错的时候返回错误代码。
if(status!
=0)
returnstatus;
try{
//��参数或者文件名�u��
Stringname=null;
//参数的value
Stringvalue=null;
//读取的流是否为文件的标志位
booleanfileFlag=false;
//要存储的文件。
FiletmpFile=null;
//上传的文件的名字
StringfName=null;
FileOutputStreambaos=null;
BufferedOutputStreambos=null;
//��存储参数的Hashtable
paramHt=newHashtable();
updFileArr=newArrayList();
intrtnPos=0;
byte[]buffs=newbyte[BUFSIZE*8];
//�取得ContentType
StringcontentType=request.getContentType();
intindex=contentType.indexOf("boundary=");
Stringboundary="--"+contentType.substring(index+9);
StringendBoundary=boundary+"--";
//�从request对象中取得流。
ServletInputStreamsis=request.getInputStream();
//读取1行
while((rtnPos=sis.readLine(buffs,0,buffs.length))!
=-1){
StringstrBuff=newString(buffs,0,rtnPos);
//读取1行数据�n��
if(strBuff.startsWith(boundary)){
if(name!
=null&&name.trim().length()>0){
if(fileFlag){
bos.flush();
baos.close();
bos.close();
baos=null;
bos=null;
updFileArr.add(fName);
}else{
Objectobj=paramHt.get(name);
ArrayListal=newArrayList();
if(obj!
=null){
al=(ArrayList)obj;
}
al.add(value);
System.out.println(value);
paramHt.put(name,al);
}
}
name=newString();
value=newString();
fileFlag=false;
fName=newString();
rtnPos=sis.readLine(buffs,0,buffs.length);
if(rtnPos!
=-1){
strBuff=newString(buffs,0,rtnPos);
if(strBuff.toLowerCase().startsWith(
"content-disposition:
form-data;")){
intnIndex=strBuff.toLowerCase().indexOf(
"name=\"");
intnLastIndex=strBuff.toLowerCase().indexOf(
"\"",nIndex+6);
name=strBuff.substring(nIndex+6,nLastIndex);
}
intfIndex=strBuff.toLowerCase().indexOf(
"filename=\"");
if(fIndex!
=-1){
fileFlag=true;
intfLastIndex=strBuff.toLowerCase().indexOf(
"\"",fIndex+10);
fName=strBuff.substring(fIndex+10,fLastIndex);
fName=getFileName(fName);
if(fName==null||fName.trim().length()==0){
fileFlag=false;
sis.readLine(buffs,0,buffs.length);
sis.readLine(buffs,0,buffs.length);
sis.readLine(buffs,0,buffs.length);
continue;
}else{
fName=getFileNameByTime(fName);
sis.readLine(buffs,0,buffs.length);
sis.readLine(buffs,0,buffs.length);
}
}
}
}elseif(strBuff.startsWith(endBoundary)){
if(name!
=null&&name.trim().length()>0){
if(fileFlag){
bos.flush();
baos.close();
bos.close();
baos=null;
bos=null;
updFileArr.add(fName);
}else{
Objectobj=paramHt.get(name);
ArrayListal=newArrayList();
if(obj!
=null){
al=(ArrayList)obj;
}
al.add(value);
paramHt.put(name,al);
}
}
}else{
if(fileFlag){
if(baos==null&&bos==null){
tmpFile=newFile(uploadPath+fName);
baos=newFileOutputStream(tmpFile);
bos=newBufferedOutputStream(baos);
}
bos.write(buffs,0,rtnPos);
baos.flush();
}else{
System.out.println("test:
"+value+"--"+strBuff);
value=value+strBuff;
}
}
}
}catch(IOExceptione){
status=4;
}
returnstatus;
}
privateintpreCheck(){
interrCode=0;
if(request==null)
return1;
if(uploadPath==null||uploadPath.trim().length()==0)
return2;
else{
FiletmpF=newFile(uploadPath);
if(!
tmpF.exists())
return2;
}
StringcontentType=request.getContentType();
if(contentType.indexOf("multipart/form-data")==-1)
return3;
returnerrCode;
}
publicStringgetParameter(Stringname){
Stringvalue="";
if(name==null||name.trim().length()==0)
returnvalue;
value=(paramHt.get(name)==null)?
"":
(String)((ArrayList)paramHt.get(name)).get(0);
returnvalue;
}
publicString[]getParameters(Stringname){
if(name==null||name.trim().length()==0)
returnnull;
if(paramHt.get(name)==null)
returnnull;
ArrayListal=(ArrayList)paramHt.get(name);
String[]strArr=newString[al.size()];
for(inti=0;i strArr[i]=(String)al.get(i); returnstrArr; } publicintgetUpdFileSize(){ returnupdFileArr.size(); } publicString[]getUpdFileNames(){ String[]strArr=newString[updFileArr.size()]; for(inti=0;i strArr[i]=(String)updFileArr.get(i); returnstrArr; } privateStringgetFileName(Stringinput){ intfIndex=input.lastIndexOf("\\"); if(fIndex==-1){ fIndex=input.lastIndexOf("/"); if(fIndex==-1){ returninput; } } input=input.substring(fIndex+1); returninput; } privateStringgetFileNameByTime(Stringinput){ intindex=input.indexOf("."); Datedt=newDate(); SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMddHHmmssSSS"); returninput.substring(0,index)+sdf.format(dt)+input.substring(index); } } 说明: 这个类基本解决了上一贴的上一贴说的存在的bug和不足。 主要做了如下修正。 1.用户可以设定文件上传的路径,这里没有用request对象的getRealPath方法来取得相对路径,而是用了绝对路径。 是一个小败笔。 因为有时候用户只是得到服务器的一个应用,而不知道整个服务器的路径。 但是既然getRealP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- jsp 实现 文件 上传 下载 代码 说明