`

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

阅读更多

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

获得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实现多文件上传.rar”这个压缩包中,我们聚焦于一个特定的功能:使用Ext3.0来实现实时的多文件上传功能。这个功能通常在网页应用中用于让用户能够一次性上传多个文件,如图片、文档等,极大地提高了用户...

    基于thinkPHP的文件上传+layui实现头像上传功能:

    确保文件上传过程的安全性,避免恶意文件的上传,同时提供流畅、友好的用户交互,是实现高质量头像上传功能的关键。通过ThinkPHP和Layui的结合,我们可以快速、高效地实现这些目标。 在提供的"sendIMG"文件中,可能...

    jquery上传插件uploadify+php完美实现强大的文件上传功能实例+程序

    在IT行业中,文件上传功能是网站和应用程序中不可或缺的一部分,特别是在需要用户提交文件或数据时。本实例将探讨如何利用jQuery上传插件Uploadify与PHP技术来构建一个强大的文件上传系统。Uploadify是一款广泛使用...

    java实现大文件上传并有进度条及其代码解析

    为了提供更好的用户体验,通常需要添加进度条功能,让用户了解文件上传的状态。本文将详细介绍如何使用Java实现大文件的上传并展示进度条,同时解析相关的代码实现。 1. **大文件分块上传** 大文件上传的关键在于...

    用Struts框架实现多文件上传功能(初学者的入门项目案例)

    要实现文件上传,你需要完成以下步骤: 1. **配置Struts2上传插件**: 在`struts.xml`配置文件中,添加上传插件的配置,确保它启用并指定了临时文件存储路径: ```xml ... ``` 2. **创建...

    Python中实现文件与服务端上传下载功能。

    或者直接将py文件放到已经打开的任务下去尝试。 127.0.0.1是计算机内部回环地址, 如果需要和别人玩请把内部回环地址改成自己的ip地址,记住客户端也需要改成你的ip地址,不然查询不到会报错,挡在门口。 文件...

    php文件上传模块,实现文件的上传

    本文将详细讲解如何使用PHP实现文件上传模块,以及在这个过程中需要注意的关键知识点。 ...当表单提交时,这些文件会以多部分/边界...开发者需要充分理解和掌握这些知识点,才能有效地实现一个健壮且安全的文件上传功能。

    web页面多选上传文件的实现(浏览器-打开文件-可选多个文件来上传).源代码

    传统的文件上传方式通常只允许用户选择一个文件,但随着技术的发展,现在我们可以实现多选文件上传功能,让用户能够一次性上传多个文件,极大地提高了用户体验。本教程将探讨如何在网页中实现多选文件上传,基于提供...

    .net文件上传下载功能实现demo

    这个".net文件上传下载功能实现demo"是一个具体的实例,展示了如何在ASP.NET环境中处理此类功能,特别是针对华北理工大学综合测评管理系统的应用场景。以下是对这个demo涉及的关键知识点的详细说明: 1. **文件上传...

    大文件上传, ajax 实现, 支持10G以上的上传

    本教程将基于标题“大文件上传,ajax实现,支持10G以上的上传”和描述,详细介绍如何使用AJAX实现大文件上传,并探讨其背后的原理和技巧。 首先,理解大文件上传的关键在于分块上传。当文件过大时,一次性上传整个...

    http上传下载C++代码实现

    ### HTTP上传下载C++代码实现解析 #### 一、概览 本文将深入解析一个用于HTTP上传下载...综上所述,本案例为我们提供了一个实用的参考模型,对于想要了解或实现HTTP文件上传下载功能的开发者来说具有较高的参考价值。

    SprignBoot中实现文件上传示例代码

    这个示例代码将向我们展示如何在Spring Boot应用中实现文件上传的完整流程,包括前端表单设置、后端控制器处理、以及文件存储。 首先,我们需要在前端创建一个HTML表单,用户可以通过该表单选择文件并提交。表单...

    php文件上传插件(简洁好用的上传插件)

    然后,在需要实现文件上传功能的PHP脚本中引入该插件,通过调用其提供的函数来完成文件的接收、验证和保存。例如: ```php require_once 'path/to/upload.class.php'; $upload = new Upload(); $upload-&gt;...

    frameset 上传文件窗口最小化(未实现)

    当我们涉及到文件上传功能时,常常会使用到iframe或者frameset来创建一个独立的窗口,使得上传过程不会影响到主页面的交互体验。标题“frameset 上传文件窗口最小化(未实现)”表明我们正在探讨如何在使用frameset...

    文件上传Netbeans项目

    在本文中,我们将深入探讨如何使用Java和JSP在NetBeans IDE中实现一个简单的文件上传功能。NetBeans是一个流行的开源集成开发环境(IDE),支持多种编程语言,包括Java,非常适合初学者和专业开发者进行Web应用的...

    SpringMVC文件上传Demo代码

    在SpringMVC中实现文件上传是一项常见的任务,它允许用户通过表单将本地文件发送到服务器进行存储或处理。这个"SpringMVC文件上传Demo代码"是一个实例,演示了如何配置和使用SpringMVC来实现这一功能。 首先,我们...

    php一次上传多个文件,多文件上传功能.zip

    在PHP中实现多文件上传功能是一项常见的任务,尤其在开发涉及用户交互的Web应用时,如文件管理系统或图片分享平台。下面将详细讲解如何通过PHP实现这个功能。 首先,我们需要理解HTML表单如何处理文件上传。在HTML5...

    在Struts 2中实现文件上传

    通过上述步骤,我们可以成功地在Struts 2中实现文件上传功能。需要注意的是,在实际应用中可能还需要考虑更多的细节,比如文件大小限制、文件类型过滤以及错误处理等。这些额外的功能可以通过调整Struts配置文件或是...

    多文件上传功能

    在IT领域,多文件上传功能是一项常见的用户交互需求,尤其在文档管理、图像分享、协作平台等场景中不可或缺。这项功能允许用户同时选择并上传多个文件到服务器,极大地提升了数据传输的效率。以下是对多文件上传功能...

    boostrap 4 文件上传插件

    Bootstrap 4 文件上传插件是基于流行的前端框架Bootstrap 4设计的一款组件,它极大地简化了在Web应用中实现文件上传功能的过程。这个插件通常包括JavaScript、CSS和HTML元素,以便提供美观且易于使用的界面,同时也...

Global site tag (gtag.js) - Google Analytics