专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » ajax实现文件上传:JavaBean实现多文件上传的两种思路方法 »正文

ajax实现文件上传:JavaBean实现多文件上传的两种思路方法

来源: 发布时间:星期四, 2008年12月18日 浏览:40次 评论:0
摘要:本文介绍了JavaBean实现多个文件上传两种思路方法分别是使用http协议和ftp协议实现首先讲述了http协议传送多个文件基本格式和实现上传详细过程的后简单介绍了使用ftpclient 类实现了ftp方式上传最后对这两种思路方法进行了比较   关键字:JavaBean 、http 、ftp 、ftpclient   JavaBean是种基于Java软件Software组件JSP对于在Web 应用中集成JavaBean组件提供了完善支持这种支持不仅能缩短开发时间(可以直接利用经测试和可信任已有组件避免了重复开发)也为JSP应用带来了更多可伸缩性   文件上传功能在基于B/S开发模式中非常普遍同其他开发工具相比较JSP对文件上传支持并不是很完美它既不象ASP那样定需要使用组件来完成也不像PHP那样直接提供了文件上载支持JSP实现文件上传实现方式是这样:使用ServletRequest类getInputStream思路方法获得个客户端向服务器发出数据流然后处理这个数据流从中分析、得到文件上传中传递到服务器各个参数和数据然后将其中文件数据存储为个文件或插入到数据库中通常JSP页面中不处理文件上传功能而是把这些功能放到Servlet 或JavaBean中去实现使用Servlet完成文件上传例子在些JSP相关书籍中都有所介绍我这里介绍使用JeanBean是如何完成文件上传JSP中实现文件上传可以采用两种方式即采用HTTP协议和FTP协议实现 2者在传输原理上存在很大差异以下将结合源代码对它们实现做简单介绍相信读者会从中有所收获以下已经调试通过调试环境:window 2000 server+Apache +tomcat4.0JavaBean调试环境:JDK1.4+Editplus   在JSP中使用JavaBean实现基于Web文件上传功能般需要 3种文件结合完成这 3种文件分别是提供界面HTML页面文件、完成实现上传功能JavaBeanJSP文件和实现JavaBeanJava类文件以下我将重点讲述采用HTTP协议和FTP协议实现文件上传功能JavaBean部分   1 采用HTTP协议实现多个文件上传   在过去Html中表单不能实现文件上传这多少限制了些网页功能RFC1867规范标准(即Html中实现基于表单文件上传)对表单作出了扩展增加了个表单元素〈input type=file>通过使用这个元素浏览器会自动生成个输入框和个按钮输入框可供用户填写本地文件名和路径名按钮可以让浏览器打开个文件选择框供用户选择文件具体表单实现如下:
  当选择了粘贴文件后就直接输入本地文件绝对路径表单action属性值是*.jsp这意味着请求(包括上载文件)将发送给*..jsp文件在这个过程中实际上就实现了HTTP方式文件上载文件从客户端到服务器上载是由HTTP协议通用网关界面(CGI)支持这种上载方式要求浏览器和WEBServer两方面都能够支持Rfc1867JavaBean 通过ServletRequest类getInputStream思路方法获得个客户端向服务器发出数据流、分析上传文件格式根据分析结果将多个文件依次输出服务器端目标文件中本例中JavaBeande功能是由testUpload类具体实现TestUpload类框架如下: public testUpload { public testUpload{……} public final void initialize(ServletConfig config) throws ServletException { m_application = config.getServletContext; } public void upload throws testUploadException, IOException, ServletException {………} private void getDataSection{………} private void getDataHeader{………} public save (String destPathName) throws SmartUploadException, IOException, ServletException {………} …… }   通过initialize()思路方法化Servlet运行环境使用upload思路方法获得输入流并分析上传文件格式并将各个上传文件属性赋给多个File类例子处理这些File类例子由Files类管理File类根据各文件属性save 思路方法将多个文件依次输出服务器端目标文件中其中upload思路方法是关键用于分析http1.1协议传送文件格式经过测试我们得出传输流文件格式这对理解upload思路方法很有用例如上传我文档\tt.txt文件格式如下: //文件分隔符 -----------------------------7d226137250336 //文件信息头 Content-Disposition: form-data; name="FILE1"; filename="C:\Documents and Settings\Administrator.TIMBER-4O6B0ZZ0\My Documents\tt.sql" Content-Type: text/plain //源文件内容 create table info( content image null); //下个文件分隔符 -----------------------------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(Exception e){ throw SmartUploadException("Unable to upload.");}   这里采用了循环中多字节读取思路方法以上循环不断地读取数据直到填满为止如果个文件可以完全得到则文件所有字节也就可以全部得到但是网络速度通常比CPU慢得多所以很容易在所有数据到来的前就清空网络缓冲区实际上多字节读取思路方法在试图从暂时为空但是开放网络缓存Cache区读取数据时该思路方法会返回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 3个思路方法完成文件上传过程主要实现如下: public ftpUpload { String filename;String filename1;FtpClient ftpClient; public void connectServer( server, user, password, path) { //server:FTP服务器IP地址;user:登录FTP服务器用户名 //password:登录FTP服务器用户名口令;path:FTP服务器上路径 try{ ftpClient= FtpClient; ftpClient.openServer(server); ftpClient.login(user, password); .out.prln("login success!"); (path.length!=0) ftpClient.cd(path); ftpClient.binary; }catch (IOException ex) {.out.prln(ex);} } public void closeConnect {try{ ftpClient.closeServer; }catch (IOException ex) {.out.prln(ex);} } public void upload { filename1=findFileName(filename); //从filename中分析出文件名称作为目标文件名称,具体思路方法实现未给出 try { TelnetOutputStream os=ftpClient.put(filename1); java.io.File file_in= java.io.File(filename); FileInputStream is= FileInputStream(file_in); s= [1024]; c; while ((c=is.read(s))!=-1){ os.write(s,0,c); } is.close; os.close; } catch (IOException ex) {.out.prln(ex);} } }   connectServer完成和FTP服务器建立连接功能使用FtpClientopenServer( server)思路方法打开远程FTP服务器,然后使用FtpClientlogin(user, password)思路方法登录服务器登录远程FTP服务器有两种方式种是注册用户登录种是以匿名方式登录前者要求用户首先注册为服务器客户服务器会给客户个登录账号和密码依据账号和密码连结到服务器上后者要求用户不用注册而使用特殊用户名"annoymous"和"guest"有限制访问远程主机公开文件现在许多系统要求用户将Email地址作为口令出于安全大部分匿名FTP主机般只允许远程用户下载文件而不允许上传这将依赖于FTP服务器设置用户可根据实际情况选择使用两种方式登录完成后使用FtpClientbinary思路方法化传输方式为字节方式upload完成文件上传功能创建源文件文件输入流FileInputStream,将输入流写入到字节利用TelnetOutputStreamwrite思路方法将字节数据写入到个网络链接上由于TelnetOutputStream打开是FTP服务器上个文件所以数据写入到了目标文件中这样就完成了文件上传closeConnect要求和服务器断开连接   以上只是单个文件上传过程如果是多个文件可以多次此上传过程由以上两种方式我们可以看出采用FTP协议实现多个文件上传比较简单容易实现利用FTP协议上传文件般是编写客户端服务器端安全设置会比较复杂;而利用HTTP协议上传文件则是服务器端应用相对来说安全设置会比较简单并且通过测试发现FTP上传方式在传输大文件时速度是HTTP上传方式几十倍甚至几百倍但在传输小于1M文件时却比HTTP上传方式稍慢所以说两种传输方式各有优势请读者根据自身情况量力而行如果有什么问题或者是需要其他部分源码请和我联系!

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: