欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自己尝试实现的文件上传功能

程序员文章站 2022-07-01 17:02:56
...

今天偶然想自己实现一下文件上传功能,但又不知从何入手,于是打算走一步算一步。

获得request的输入流,将其完全输出,发现里面的内容格式是类似于这样的:

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 -----------------------------7d81853a1055a
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Content-Disposition:form-data;name="first"
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 FirstPara
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 -----------------------------7d81853a1055a
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Content-Disposition:form-data;name="file";filename="C://DocumentsandSettings//RayChase//桌面//Try.txt"
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Content-Type:text/plain
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 TRY
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 -----------------------------7d81853a1055a
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Content-Disposition:form-data;name="last"
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 LastPara
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 -----------------------------7d81853a1055a--

其中的双斜杠应该为单斜杠。这样一来我就有思路了:

文件参数之前有个表单参数first,之后有个表单参数last,而分隔这三者的皆是被我称为“分隔符”的东西,即是那个"-----------------------------7d81853a1055a"这样的内容,那么我想我先获取分隔符,然后从那一串filename="......"中获取文件名Try.txt,并从下面一行的Content-Type的后面获取浏览器认定的文件类型,再跳过一个空行,下面就是文件内容了,接着分隔符则标志着文件内容的结束。由此,我就可以依据解析的文件名建立文件,再将对应的文件内容写入了。

那就来尝试一下吧。后来找了几个算法,都有个问题,就是在输入文件内容后总会多加上一个回车换行符(源于request擅自添加的);而我的实现倒是没有这个问题。

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 packagecom.XiongYi.file;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjava.io.File;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjava.io.FileOutputStream;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjava.io.IOException;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjava.io.InputStream;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjavax.servlet.ServletException;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjavax.servlet.ServletInputStream;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjavax.servlet.http.HttpServlet;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjavax.servlet.http.HttpServletRequest;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
importjavax.servlet.http.HttpServletResponse;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
publicclassUploadGroupwareextendsHttpServlet...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
/***//**
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *ThedoGetmethodoftheservlet.<br>
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@paramrequesttherequestsendbytheclienttotheserver
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@paramresponsetheresponsesendbytheservertotheclient
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@throwsServletExceptionifanerroroccurred
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@throwsIOExceptionifanerroroccurred
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
*/

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
throwsServletException,IOException...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 doPost(request,response);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
/***//**
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *ThedoPostmethodoftheservlet.<br>
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *Thismethodiscalledwhenaformhasitstagvaluemethodequalstopost.
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@paramrequesttherequestsendbytheclienttotheserver
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@paramresponsetheresponsesendbytheservertotheclient
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@throwsServletExceptionifanerroroccurred
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 *
@throwsIOExceptionifanerroroccurred
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
*/

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
throwsServletException,IOException...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 System.out.println(request.getParameter(
"first"));
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 System.out.println(request.getParameter(
"file"));
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//jsp页面中加入了enctype="multipart/form-data"
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//那么这两句话是没有用的,只能输出null。
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 ServletInputStreamsis
=request.getInputStream();
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
bytebuf[]=newbyte[1024];
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
intnum;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Strings;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Stringtype
=null;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Stringpagination
=null;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//分隔符。比如:-----------------------------7d83152f30556
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
while((num=sis.readLine(buf,0,buf.length))!=-1)...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//readLine的第三个参数和read方法的第三个参数不同,
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//read方法第三个参数若为-1表示取到流末尾,
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//readLine方法则不能这么用。
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(pagination==null)
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 pagination
=newString(buf,0,num);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 s
=newString(buf,0,num,"GBK");
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(s.startsWith("Content-Disposition:"))...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//可能会出现文件
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 StringnextS;
//下一行
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
num=sis.readLine(buf,0,buf.length);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 nextS
=newString(buf,0,num,"GBK");
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(!nextS.startsWith("Content-Type:"))
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
continue;//看来不是文件,继续吧
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 type
=nextS.substring(nextS.indexOf("")+1);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//读取上传文件类型信息
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
System.out.println(type);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Stringname
=s.substring(s.lastIndexOf("/")+1,s.length()-3);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//取出名字来
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
System.out.println(name);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 Filefile
=newFile("./upload/"+name);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 FileOutputStreamfos
=newFileOutputStream(file);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 sis.readLine(buf,
0,buf.length);//跳过空行
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
bytebuf2[]=newbyte[1024];
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//再准备一个相同大小的缓冲数组是为了交替使用,
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//以便在发现文件结束时避免输出最末两个字节(回车换行符),
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//而这最末的两个字节是request自己加上的!
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
intnum2=0;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
booleanwhichBuf=true;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
//确定使用哪个缓冲数组
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
while(num!=-1&&num2!=-1)...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(whichBuf)...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num
=sis.readLine(buf,0,buf.length);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 s
=newString(buf,0,num,"GBK");
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(s.startsWith(pagination))...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(num2>=2)
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num2
=num2-2;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 fos.write(buf2,
0,num2);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num
=-1;//写完了
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
}
else...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 fos.write(buf2,
0,num2);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
else...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num2
=sis.readLine(buf2,0,buf2.length);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 s
=newString(buf2,0,num2,"GBK");
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(s.startsWith(pagination))...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
if(num>=2)
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num
=num-2;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 fos.write(buf,
0,num);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 num2
=-1;//写完了
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
}
else...{
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 fos.write(buf,
0,num);
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
//else
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
whichBuf=!whichBuf;
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
//while
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 fos.close();
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
//if
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
//while
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
sis.close();
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }
//doPost
自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 }

自己尝试实现的文件上传功能
            
    
    博客分类: Note & Try 上传文件 

经试验上传各种类型的文件(包括图片、文本等)都没有问题。

如果有其他或者优化的方法,请不吝赐教。

相关标签: 上传 文件