仓酷云

标题: JAVA教程之JavaBean完成多文件上传的两种办法 [打印本页]

作者: 深爱那片海    时间: 2015-1-18 11:44
标题: JAVA教程之JavaBean完成多文件上传的两种办法
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。上传择要:本文先容了JavaBean完成多个文件上传的两种办法,分离是利用http协定和ftp协定完成。起首报告了http协定传送多个文件的基础格局和完成上传的具体历程,以后复杂先容了利用ftpclient类完成了ftp体例的上传,最初对这两种办法举行了对照。

  关头字:JavaBean、http、ftp、ftpclient

  JavaBean是一种基于Java的软件组件。JSP关于在Web使用中集成JavaBean组件供应了完美的撑持。这类撑持不但能延长开辟工夫(能够间接使用经测试和可托任的已有组件,制止了反复开辟),也为JSP使用带来了更多的可伸缩性。

  文件的上传功效在基于B/S的开辟形式中十分广泛。同其他开辟工具比拟较,JSP对文件的上传撑持并非很完善,它既不象ASP那样必定必要利用组件来完成,也不像PHP那样间接供应了文件上载的撑持。JSP完成文件上传的完成体例是如许的:利用ServletRequest类的getInputStream()办法取得一个客户端向服务器收回的数据流,然后处置这个数据流,从平分析、失掉文件上传中传送到服务器的各个参数和数据,然后将个中的文件数据存储为一个文件或拔出到数据库中。一般JSP页面中不处置文件的上传功效,而是把这些功效放到Servlet或JavaBean中往完成。利用Servlet完成文件上传的例子在一些JSP的相干书本中都有所先容,我这里先容利用JeanBean是怎样完成文件上传的。JSP中完成文件的上传能够接纳两种体例即接纳HTTP协定和FTP协定完成,两者在传输的道理上存在很年夜的差别。以下将分离源代码对它们的完成做复杂先容,信任读者会从中有所劳绩。以下程序已调试经由过程。调试的情况:window2000server+Apache+tomcat4.0,JavaBean调试情况:JDK1.4+Editplus。

  在JSP中利用JavaBean完成基于Web的文件上传功效一样平常必要三种文件分离完成。这三种文件分离是供应界面的HTML页面文件、完成挪用完成上传功效的JavaBean的JSP文件和完成JavaBean的Java的类文件。以下我将重点报告接纳HTTP协定和FTP协定完成文件上传功效的JavaBean部分。

  1接纳HTTP协定完成多个文件的上传

  在已往的Html中,表单不克不及完成文件的上传,这几限定了一些网页的功效。RFC1867标准(即Html中完成基于表单的文件上传)对表单作出了扩大,增添了一个表单位素〈inputtype=file>。经由过程利用这个元素,扫瞄器会主动天生一个输出框和一个按钮,输出框可供用户填写当地的文件名和路径名,按钮可让扫瞄器翻开一个文件选择框供用户选择文件。详细的表单完成以下:

<FORMMETHOD="POST"ACTION="*.jsp"ENCTYPE="multipart/form-data">
<INPUTTYPE="FILE"NAME="FILE1"SIZE="50"><BR>
<INPUTTYPE="SUBMIT"VALUE="Upload">
</FORM>

  中选择了粘贴文件后就间接输出当地文件的相对路径,表单的action属性值是*.jsp,这意味着哀求(包含上载的文件)将发送给*..jsp文件。在这个过程当中实践上就完成了HTTP体例的文件上载。文件从客户端到服务器的上载是由HTTP协定的通用网关界面(CGI)撑持的。这类上载体例请求扫瞄器和WEBServer两方面都可以撑持Rfc1867。JavaBean经由过程ServletRequest类的getInputStream()办法取得一个客户端向服务器收回的数据流、剖析上传的文件格局,依据剖析了局将多个文件顺次输入服务器真个方针文件中。本例中的JavaBeande的功效是由testUpload类详细完成。TestUpload类的框架以下:

publicclasstestUpload
{
publictestUpload(){……}
publicfinalvoidinitialize(ServletConfigconfig)throwsServletException
{m_application=config.getServletContext();}
publicvoidupload()throwstestUploadException,IOException,ServletException
{………}
privatevoidgetDataSection(){………}
privatevoidgetDataHeader(){………}
publicintsave(StringdestPathName)
throwsSmartUploadException,IOException,ServletException
{………}
……
}

  经由过程initialize()办法初始化Servlet的运转情况。利用upload()办法取得输出流,并剖析上传文件的格局,并将各个上传文件的属性赋给多个File类实例处置,这些File类实例由Files类办理。File类依据各文件的属性挪用它的save()办法将多个文件顺次输入服务器真个方针文件中。个中upload()办法是关头,用于剖析http1.1协定传送文件的格局。经由测试,我们得出传输流文件的格局,这对了解upload()办法很有效。比方,上传我的文档t.txt文件。格局以下:

//文件分开符
-----------------------------7d226137250336
//文件信息头
Content-Disposition:form-data;name="FILE1";filename="C:DocumentsandSettingsAdministrator.TIMBER-4O6B0ZZ0MyDocumentst.sql"
Content-Type:text/plain
//源文件内容
createtableinfo(
contentimagenull);
//下一个文件的分开符
-----------------------------7d226137250336
Content-Disposition:form-data;name="FILE2";filename=""
Content-Type:application/octet-stream
-----------------------------7d226137250336

  从以上文件我们能够看出,HTTP协定在上传多个文件时,是将文件全体放到输出流并以必定的分开符来辨别的。实践上upload()办法就是要剖析下面的文件,断定分开符的内容、各个文件的内容格局、文件的完全路径称号、及其文件的实践数据的委曲地位。这里必要申明的一点是分开符是随机的,它是传输流文件的第一个回车符之前的一切字符。

  Upload()办法的完成流程是:起首将输出流文件输入到字节数组m_binArray中,经由过程上面的代码完成。

m_totalBytes=1024;totalRead=0;
for(;totalRead<m_totalBytes;totalRead+=readBytes)
try
{m_request.getInputStream();
readBytes=m_request.getInputStream().read(m_binArray,totalRead,m_totalBytes-totalRead);
}catch(Exceptione){thrownewSmartUploadException("Unabletoupload.");}

  这里接纳了轮回中多字节读取办法,以上轮回不休地读取数据直到数组填满为止。假如一个文件能够完整失掉,则文件的一切字节也就能够全体失掉。可是由于收集速率一般比CPU慢很多,以是程序很简单在一切的数据到来之前就清空收集缓冲区。实践上,多字节读取办法在试图从临时为空可是开放的收集缓存区读取数据时,该办法会前往0,这暗示没无数据存在但收集流没有封闭。这类情形下,单字节办法将制止运转程序的实行,以是多字节的举动优于单字节read()办法的举动。接上去将剖析字节数组m_binArray。起首找到分开符;利用getDataHeader()办法前往文件信息头的值,从中断定源文件的完全路径名、源文件的扩大名和源文件文件内容格局;利用getDataSection()办法前往文件的内容数据,并纪录文件数据在字节数组中的起止地位。然后天生一个File类实例,并将文件的完全路径名、源文件的扩大名、源文件文件内容格局和文件的内容数据的起止地位放到File类实例的属性中。找到下一个分开符,持续反复上述历程,直至剖析终了。

  2接纳FTP协定完成多个文件的上传

  FTP协定是Internet上用来传送文件的协定,划定了Internet上文件相互传送的尺度。在java中完成这一功效是借助FtpClient类完成的。详细完成历程:起首与FTP服务器创建毗连;初始化文件的传输体例,包含ASCII和BINARY两种体例;将文件输入到文件输出流FileInputStream中;FileInputStream中的数据读进字节数组中;字节数组中的数据写进输入流TelnetOutputStream(使用write办法将数据写进到一个收集链接上)。如许和源文件同名的一个文件就复制到了服务器端。本例的JavaBean中经由过程connectServer()、upload()和closeConnect()三个办法完成文件上传历程。次要完成以下:

publicclassftpUpload
{Stringfilename;Stringfilename1;FtpClientftpClient;
publicvoidconnectServer(stringserver,stringuser,stringpassword,stringpath)
{
//server:FTP服务器的IP地点;user:登录FTP服务器的用户名
//password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径
try{ftpClient=newFtpClient();
ftpClient.openServer(server);
ftpClient.login(user,password);
System.out.println("loginsuccess!");
if(path.length()!=0)ftpClient.cd(path);
ftpClient.binary();}catch(IOExceptionex){System.out.println(ex);}
}
publicvoidcloseConnect()
{try{ftpClient.closeServer();
}catch(IOExceptionex){System.out.println(ex);}
}
publicvoidupload()
{filename1=findFileName(filename);
//从filename平分析出文件的称号,作为方针文件的称号,详细办法完成未给出
try{
TelnetOutputStreamos=ftpClient.put(filename1);
java.io.Filefile_in=newjava.io.File(filename);
FileInputStreamis=newFileInputStream(file_in);
byte[]bytes=newbyte[1024];
intc;
while((c=is.read(bytes))!=-1){os.write(bytes,0,c);}
is.close();os.close();
}catch(IOExceptionex){System.out.println(ex);}
}
}

  connectServer()完成与FTP服务器创建毗连的功效,利用FtpClient的openServer(stringserver)办法翻开远程FTP服务器,然后利用FtpClient的login(user,password)办法登录服务器。登录远程FTP服务器有两种体例,一种是注册用户登录,另外一种是以匿名体例登录。前者请求用户起首注册为服务器的客户,服务器会给客户一个登录账号和暗码,根据账号和暗码保持到服务器上。后者请求用户不必注册而利用特别的用户名"annoymous"和"guest"无限制的会见远程主机的公然文件,如今很多体系请求用户将Email地点作为口令。出于平安的目标,年夜部分匿名FTP主机一样平常只同意远程用户下载文件,而不同意上传,这将依附于FTP服务器的设置。用户可依据实践情形选择利用两种体例。登录完成后利用FtpClient的binary()办法初始化传输体例为字节体例。upload()完成文件的上传功效。创立源文件的文件输出流FileInputStream,将输出流写进到字节数组中,使用TelnetOutputStream的write办法将字节数组中的数据写进到一个收集链接上。因为TelnetOutputStream翻开的是FTP服务器上的一个文件,以是数据写进到了方针文件中,如许就完成了文件上传。closeConnect()请求与服务器断开毗连。

  以上只是单个文件上传的历程,假如是多个文件能够屡次挪用此上传历程。由以上两种体例我们能够看出接纳FTP协定完成多个文件的上传对照复杂,简单完成。使用FTP协定上传文件通常为编写的客户真个程序,服务器真个平安设置会对照庞大;而使用HTTP协定上传文件则是服务器真个使用程序,绝对来讲平安设置会对照复杂。而且经由过程测试发明FTP上传体例在传输年夜文件时速率是HTTP上传体例的几十倍乃至几百倍,但在传输小于1M的文件时却比HTTP上传体例稍慢一些。以是说两种传输体例各有上风,请读者依据本身情形实事求是。假如有甚么成绩大概是必要其他部分的源码,请与我接洽!


他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。
作者: 柔情似水    时间: 2015-1-21 13:27
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 小魔女    时间: 2015-1-30 19:09
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 分手快乐    时间: 2015-2-2 22:06
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者: 再见西城    时间: 2015-2-8 09:09
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
作者: 兰色精灵    时间: 2015-2-10 10:51
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 灵魂腐蚀    时间: 2015-2-13 10:47
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 乐观    时间: 2015-3-3 19:24
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 不帅    时间: 2015-3-11 04:22
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 变相怪杰    时间: 2015-3-13 23:09
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 精灵巫婆    时间: 2015-3-20 21:42
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 冷月葬花魂    时间: 2015-3-25 21:12
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 若天明    时间: 2015-3-30 16:54
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 再现理想    时间: 2015-4-6 02:08
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 飘飘悠悠    时间: 2015-4-6 03:10
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 谁可相欹    时间: 2015-4-6 09:03
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 小女巫    时间: 2015-4-11 00:41
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 山那边是海    时间: 2015-5-10 05:32
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 因胸联盟    时间: 2015-5-12 13:25
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者: 愤怒的大鸟    时间: 2015-6-11 13:48
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2