今天偶然想自己实现一下文件上传功能,但又不知从何入手,于是打算走一步算一步。
获得request的输入流,将其完全输出,发现里面的内容格式是类似于这样的:
-----------------------------7d81853a1055a
Content-Disposition:form-data;name="first"
FirstPara
-----------------------------7d81853a1055a
Content-Disposition:form-data;name="file";filename="C://DocumentsandSettings//RayChase//桌面//Try.txt"
Content-Type:text/plain
TRY
-----------------------------7d81853a1055a
Content-Disposition:form-data;name="last"
LastPara
-----------------------------7d81853a1055a--
其中的双斜杠应该为单斜杠。这样一来我就有思路了:
文件参数之前有个表单参数first,之后有个表单参数last,而分隔这三者的皆是被我称为“分隔符”的东西,即是那个"-----------------------------7d81853a1055a"这样的内容,那么我想我先获取分隔符,然后从那一串filename="......"中获取文件名Try.txt,并从下面一行的Content-Type的后面获取浏览器认定的文件类型,再跳过一个空行,下面就是文件内容了,接着分隔符则标志着文件内容的结束。由此,我就可以依据解析的文件名建立文件,再将对应的文件内容写入了。
那就来尝试一下吧。后来找了几个算法,都有个问题,就是在输入文件内容后总会多加上一个回车换行符(源于request擅自添加的);而我的实现倒是没有这个问题。
packagecom.XiongYi.file;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjavax.servlet.ServletException;
importjavax.servlet.ServletInputStream;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassUploadGroupwareextendsHttpServlet...{
/***//**
*ThedoGetmethodoftheservlet.<br>
*
*Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.
*
*@paramrequesttherequestsendbytheclienttotheserver
*@paramresponsetheresponsesendbytheservertotheclient
*@throwsServletExceptionifanerroroccurred
*@throwsIOExceptionifanerroroccurred
*/
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException...{
doPost(request,response);
}
/***//**
*ThedoPostmethodoftheservlet.<br>
*
*Thismethodiscalledwhenaformhasitstagvaluemethodequalstopost.
*
*@paramrequesttherequestsendbytheclienttotheserver
*@paramresponsetheresponsesendbytheservertotheclient
*@throwsServletExceptionifanerroroccurred
*@throwsIOExceptionifanerroroccurred
*/
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException...{
System.out.println(request.getParameter("first"));
System.out.println(request.getParameter("file"));
//jsp页面中加入了enctype="multipart/form-data"
//那么这两句话是没有用的,只能输出null。
ServletInputStreamsis=request.getInputStream();
bytebuf[]=newbyte[1024];
intnum;
Strings;
Stringtype=null;
Stringpagination=null;
//分隔符。比如:-----------------------------7d83152f30556
while((num=sis.readLine(buf,0,buf.length))!=-1)...{
//readLine的第三个参数和read方法的第三个参数不同,
//read方法第三个参数若为-1表示取到流末尾,
//readLine方法则不能这么用。
if(pagination==null)
pagination=newString(buf,0,num);
s=newString(buf,0,num,"GBK");
if(s.startsWith("Content-Disposition:"))...{
//可能会出现文件
StringnextS;//下一行
num=sis.readLine(buf,0,buf.length);
nextS=newString(buf,0,num,"GBK");
if(!nextS.startsWith("Content-Type:"))
continue;//看来不是文件,继续吧
type=nextS.substring(nextS.indexOf("")+1);
//读取上传文件类型信息
System.out.println(type);
Stringname=s.substring(s.lastIndexOf("/")+1,s.length()-3);
//取出名字来
System.out.println(name);
Filefile=newFile("./upload/"+name);
FileOutputStreamfos=newFileOutputStream(file);
sis.readLine(buf,0,buf.length);//跳过空行
bytebuf2[]=newbyte[1024];
//再准备一个相同大小的缓冲数组是为了交替使用,
//以便在发现文件结束时避免输出最末两个字节(回车换行符),
//而这最末的两个字节是request自己加上的!
intnum2=0;
booleanwhichBuf=true;
//确定使用哪个缓冲数组
while(num!=-1&&num2!=-1)...{
if(whichBuf)...{
num=sis.readLine(buf,0,buf.length);
s=newString(buf,0,num,"GBK");
if(s.startsWith(pagination))...{
if(num2>=2)
num2=num2-2;
fos.write(buf2,0,num2);
num=-1;//写完了
}else...{
fos.write(buf2,0,num2);
}
}else...{
num2=sis.readLine(buf2,0,buf2.length);
s=newString(buf2,0,num2,"GBK");
if(s.startsWith(pagination))...{
if(num>=2)
num=num-2;
fos.write(buf,0,num);
num2=-1;//写完了
}else...{
fos.write(buf,0,num);
}
}//else
whichBuf=!whichBuf;
}//while
fos.close();
}//if
}//while
sis.close();
}//doPost
}
经试验上传各种类型的文件(包括图片、文本等)都没有问题。
如果有其他或者优化的方法,请不吝赐教。
分享到:
相关推荐
在“Ext3.0实现多文件上传.rar”这个压缩包中,我们聚焦于一个特定的功能:使用Ext3.0来实现实时的多文件上传功能。这个功能通常在网页应用中用于让用户能够一次性上传多个文件,如图片、文档等,极大地提高了用户...
确保文件上传过程的安全性,避免恶意文件的上传,同时提供流畅、友好的用户交互,是实现高质量头像上传功能的关键。通过ThinkPHP和Layui的结合,我们可以快速、高效地实现这些目标。 在提供的"sendIMG"文件中,可能...
在IT行业中,文件上传功能是网站和应用程序中不可或缺的一部分,特别是在需要用户提交文件或数据时。本实例将探讨如何利用jQuery上传插件Uploadify与PHP技术来构建一个强大的文件上传系统。Uploadify是一款广泛使用...
为了提供更好的用户体验,通常需要添加进度条功能,让用户了解文件上传的状态。本文将详细介绍如何使用Java实现大文件的上传并展示进度条,同时解析相关的代码实现。 1. **大文件分块上传** 大文件上传的关键在于...
要实现文件上传,你需要完成以下步骤: 1. **配置Struts2上传插件**: 在`struts.xml`配置文件中,添加上传插件的配置,确保它启用并指定了临时文件存储路径: ```xml ... ``` 2. **创建...
或者直接将py文件放到已经打开的任务下去尝试。 127.0.0.1是计算机内部回环地址, 如果需要和别人玩请把内部回环地址改成自己的ip地址,记住客户端也需要改成你的ip地址,不然查询不到会报错,挡在门口。 文件...
本文将详细讲解如何使用PHP实现文件上传模块,以及在这个过程中需要注意的关键知识点。 ...当表单提交时,这些文件会以多部分/边界...开发者需要充分理解和掌握这些知识点,才能有效地实现一个健壮且安全的文件上传功能。
传统的文件上传方式通常只允许用户选择一个文件,但随着技术的发展,现在我们可以实现多选文件上传功能,让用户能够一次性上传多个文件,极大地提高了用户体验。本教程将探讨如何在网页中实现多选文件上传,基于提供...
这个".net文件上传下载功能实现demo"是一个具体的实例,展示了如何在ASP.NET环境中处理此类功能,特别是针对华北理工大学综合测评管理系统的应用场景。以下是对这个demo涉及的关键知识点的详细说明: 1. **文件上传...
本教程将基于标题“大文件上传,ajax实现,支持10G以上的上传”和描述,详细介绍如何使用AJAX实现大文件上传,并探讨其背后的原理和技巧。 首先,理解大文件上传的关键在于分块上传。当文件过大时,一次性上传整个...
### HTTP上传下载C++代码实现解析 #### 一、概览 本文将深入解析一个用于HTTP上传下载...综上所述,本案例为我们提供了一个实用的参考模型,对于想要了解或实现HTTP文件上传下载功能的开发者来说具有较高的参考价值。
这个示例代码将向我们展示如何在Spring Boot应用中实现文件上传的完整流程,包括前端表单设置、后端控制器处理、以及文件存储。 首先,我们需要在前端创建一个HTML表单,用户可以通过该表单选择文件并提交。表单...
然后,在需要实现文件上传功能的PHP脚本中引入该插件,通过调用其提供的函数来完成文件的接收、验证和保存。例如: ```php require_once 'path/to/upload.class.php'; $upload = new Upload(); $upload->...
当我们涉及到文件上传功能时,常常会使用到iframe或者frameset来创建一个独立的窗口,使得上传过程不会影响到主页面的交互体验。标题“frameset 上传文件窗口最小化(未实现)”表明我们正在探讨如何在使用frameset...
在本文中,我们将深入探讨如何使用Java和JSP在NetBeans IDE中实现一个简单的文件上传功能。NetBeans是一个流行的开源集成开发环境(IDE),支持多种编程语言,包括Java,非常适合初学者和专业开发者进行Web应用的...
在SpringMVC中实现文件上传是一项常见的任务,它允许用户通过表单将本地文件发送到服务器进行存储或处理。这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们...
在PHP中实现多文件上传功能是一项常见的任务,尤其在开发涉及用户交互的Web应用时,如文件管理系统或图片分享平台。下面将详细讲解如何通过PHP实现这个功能。 首先,我们需要理解HTML表单如何处理文件上传。在HTML5...
通过上述步骤,我们可以成功地在Struts 2中实现文件上传功能。需要注意的是,在实际应用中可能还需要考虑更多的细节,比如文件大小限制、文件类型过滤以及错误处理等。这些额外的功能可以通过调整Struts配置文件或是...
在IT领域,多文件上传功能是一项常见的用户交互需求,尤其在文档管理、图像分享、协作平台等场景中不可或缺。这项功能允许用户同时选择并上传多个文件到服务器,极大地提升了数据传输的效率。以下是对多文件上传功能...
Bootstrap 4 文件上传插件是基于流行的前端框架Bootstrap 4设计的一款组件,它极大地简化了在Web应用中实现文件上传功能的过程。这个插件通常包括JavaScript、CSS和HTML元素,以便提供美观且易于使用的界面,同时也...