`
wagnn
  • 浏览: 7156 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

JavaBean实现多个文件上传的两种方法

阅读更多
JavaBean是一种基于Java的软件组件。JSP对于在Web?应用中集成JavaBean组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性。
  
  文件的上传功能在基于B/S的开发模式中非常普遍。同其他开发工具相比较,JSP对文件的上传支持并不是很完美,它既不象ASP那样一定需要使用组件来完成,也不像PHP那样直接提供了文件上载的支持。JSP实现文件上传的实现方式是这样的:使用ServletRequest类的getInputStream()方法获得一个客户端向服务器发出的数据流,然后处理这个数据流,从中分析、得到文件上传中传递到服务器的各个参数和数据,然后将其中的文件数据存储为一个文件或插入到数据库中。通常JSP页面中不处理文件的上传功能,而是把这些功能放到Servlet 或JavaBean中去实现。使用Servlet完成文件上传的例子在一些JSP的相关书籍中都有所介绍,我这里介绍使用JeanBean是如何完成文件上传的。JSP中实现文件的上传可以采用两种方式即采用HTTP协议和FTP协议实现,二者在传输的原理上存在很大的差异。以下将结合源代码对它们的实现做简单介绍,相信读者会从中有所收获。以下程序已经调试通过。调试的环境:window 2000 server+Apache +tomcat4.0,JavaBean调试环境:JDK1.4+Editplus。
  
  在JSP中使用JavaBean实现基于Web的文件上传功能一般需要三种文件结合完成。这三种文件分别是提供界面的HTML页面文件、完成调用实现上传功能的JavaBean的JSP文件和实现JavaBean的Java的类文件。以下我将重点讲述采用HTTP协议和FTP协议实现文件上传功能的JavaBean部分。
  
  1 采用HTTP协议实现多个文件的上传
  在过去的Html中,表单不能实现文件的上传,这多少限制了一些网页的功能。RFC1867规范(即Html中实现基于表单的文件上传)对表单作出了扩展,增加了一个表单元素〈input type=file>。通过使用这个元素,浏览器会自动生成一个输入框和一个按钮,输入框可供用户填写本地的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。具体的表单实现如下:
  
  当选择了粘贴文件后就直接输入本地文件的绝对路径,表单的action属性值是*.jsp,这意味着请求(包括上载的文件)将发送给*..jsp文件。在这个过程中实际上就实现了HTTP方式的文件上载。文件从客户端到服务器的上载是由HTTP协议的通用网关界面(CGI)支持的。这种上载方式要求浏览器和WEBServer两方面都能够支持Rfc1867。JavaBean 通过ServletRequest类的getInputStream()方法获得一个客户端向服务器发出的数据流、分析上传的文件格式,根据分析结果将多个文件依次输出服务器端的目标文件中。本例中的JavaBeande的功能是由testUpload类具体实现。TestUpload类的框架如下:
  
  public class 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 int save (String destPathName)
  throws SmartUploadException, 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:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documents t.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 new SmartUploadException("Unable to upload.");}
  
  这里采用了循环中多字节读取方法,以上循环不断地读取数据直到数组填满为止。如果一个文件可以完全得到,则文件的所有字节也就可以全部得到。但是因为网络速度通常比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()三个方法完成文件上传过程。主要实现如下:
  
  public class ftpUpload
  { String filename;String filename1;FtpClient ftpClient;
  public void connectServer(string server,string user,string password,string path)
  {
  //server:FTP服务器的IP地址;user:登录FTP服务器的用户名
  //password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径
  try{ ftpClient=new FtpClient();
  ftpClient.openServer(server);
  ftpClient.login(user, password);
  System.out.println("login success!");
  if (path.length()!=0) ftpClient.cd(path);
  ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
  }
  public void closeConnect()
  {try{ ftpClient.closeServer();
  }catch (IOException ex) {System.out.println(ex);}
  }
  public void upload()
  { filename1=findFileName(filename);
  //从filename中分析出文件的名称,作为目标文件的名称,具体方法实现未给出
  try {
  TelnetOutputStream os=ftpClient.put(filename1);
  java.io.File file_in=new java.io.File(filename);
  FileInputStream is=new FileInputStream(file_in);
  byte[] bytes=new byte[1024];
  int c;
  while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c); }
  is.close(); os.close();
  } catch (IOException ex) {System.out.println(ex);}
  }
  }
  connectServer()完成与FTP服务器建立连接的功能,使用FtpClient的openServer(string server)方法打开远程FTP服务器,然后使用FtpClient的login(user, password)方法登录服务器。登录远程FTP服务器有两种方式,一种是注册用户登录,另一种是以匿名方式登录。前者要求用户首先注册为服务器的客户,服务器会给客户一个登录账号和密码,依据账号和密码连结到服务器上。后者要求用户不用注册而使用特殊的用户名"annoymous"和"guest"有限制的访问远程主机的公开文件,现在许多系统要求用户将Email地址作为口令。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载文件,而不允许上传,这将依赖于FTP服务器的设置。用户可根据实际情况选择使用两种方式。登录完成后
分享到:
评论

相关推荐

    JavaBean实现多文件上传的两种方法

    JavaBean实现多文件上传的两种方法,主要涵盖了使用HTTP协议和FTP协议进行文件上传的详细过程,这是在基于Web的应用中常见的需求,特别是在B/S架构的项目中。下面,我们将深入探讨这两种方法的具体实现和其背后的...

    jsp与servlet 上传文件 javaBean上传文件

    在Java Web开发中,JSP(JavaServer Pages)和Servlet是两种常见的技术,它们常常用于构建动态网页。在处理文件上传需求时,JSP通常作为前端界面,而Servlet则负责后端逻辑处理。本篇文章将深入探讨如何使用JSP与...

    jsp+javaBean做的一个企业门户网站毕业设计源码

    5. 文件上传与下载:如果项目中涉及,需要了解如何处理客户端的文件上传请求,以及提供文件下载服务。 6. 用户认证与授权:理解登录注册功能的实现,包括会话管理、密码加密和权限控制。 7. 错误处理与日志记录:...

    jsp分页技术和文件上传与下载,包括jspsmartupload.jar

    本文将深入探讨这两个主题,以及如何利用jspsmartupload.jar库实现文件上传。 **一、JSP分页技术** JSP分页技术主要用于处理大数据量的展示,提高页面加载速度和用户体验。常见的分页方法有以下几种: 1. **基于...

    jsp分页 上传文件

    在IT行业中,分页和文件上传是两个非常重要的功能,特别是在Web开发中。JSP(JavaServer Pages)作为Java的一种动态网页技术,提供了处理这两种需求的解决方案。 首先,我们来看分页。在大型数据集展示时,为了提高...

    jsf上传文件用到的包

    在JSF(JavaServer Faces)框架中实现文件上传功能,通常会涉及到多个依赖库,以处理文件上传的各个阶段,包括文件的解析、临时存储以及后续的业务逻辑处理。在这个场景下,`JSF上传文件用到的包`指的是一个项目中...

    档案上传下载

    在Java Web开发中,有两种常见的文件上传库:Apache Commons FileUpload和COS(China Online System)。Commons FileUpload提供了处理多部分请求的API,使得文件上传变得简单。COS则是早期的文件上传解决方案。...

    基于JSP_JavaBean开发的一套网络BBS论坛系统

    在Web开发领域,JSP(JavaServer Pages)和JavaBean是两种重要的技术,常用于构建动态网页应用。本项目利用这两种技术开发了一套完整的网络BBS论坛系统,旨在提供一个交互性强、功能完善的在线讨论平台。由于未使用...

    beanutil源代码

    这个库的核心功能在于它提供了一种简化的JavaBean操作方式,避免了直接使用反射API的复杂性。通过使用BeanUtils,开发者可以便捷地进行属性的读写,包括链式调用和类型转换。例如,`BeanUtils.copyProperties()`方法...

    JSP相关练习题,涉及语法及相关基础知识

    题目 5: 使用 Jsp 代码读取文件, 用到了两个文件,一个 jsp 文件,一个 Javabean 文件 这个题目考察了 JSP 中的文件读取和 JavaBean 的应用。解决方案可以使用 Java 的文件处理 API 来读取文本文件,并使用 ...

    JAVA中的FtpClient与FTPClient,并实现jsp面下载ftp服务器上的文件.docx

    本文将详细介绍Java中两种不同的FTP客户端库——`FtpClient`与`FTPClient`,并给出具体的示例代码来实现JSP页面下载FTP服务器上的文件功能。 #### 二、FtpClient与FTPClient对比 在开始之前,我们需要明确两个概念...

    山东建筑大学J2EE讲义

    将多个过滤器串联起来,实现更复杂的功能组合。 #### 十二、JSP+Servlet+JavaBean开发模式 **12.1 用户登录** 实现用户登录功能,包括前端表单设计、后端数据处理和认证逻辑。 **12.2 修改用户信息** 实现用户...

    java_web_mldn高级篇全套源码完整版

    4. **第08章:文件上传** - 文件上传是Web应用中的常见功能,本章将讲解如何使用Servlet和相关API处理文件上传,包括文件大小限制、多文件上传等实际问题。 5. **第09章:Servlet程序开发** - Servlet是Java Web的...

    基于Jsp+Servlet实现图书管理系统.zip

    综上所述,【基于Jsp+Servlet实现图书管理系统】项目涵盖了Web开发的多个核心知识点,包括动态网页的构建、服务器端的请求处理、数据库操作、用户认证和权限控制等。通过学习和实践这个项目,开发者可以深入理解Java...

    jsp项目源码2

    由于文件大小限制,项目被分成两部分上传,这可能意味着项目包含多个文件夹和文件,包括但不限于JSP页面、Servlet、JavaBean、配置文件以及可能的数据库连接脚本。用户需要通过链接下载完整的项目源码才能进行本地...

    网站开发代码

    【网站开发代码】这个主题涵盖了Web开发中的多个关键知识点,主要涉及JSP(JavaServer Pages)和HTML这两种技术。在网站开发中,JSP和HTML是构建动态网页和交互式用户体验的重要工具。以下是对这些技术及其在实际...

Global site tag (gtag.js) - Google Analytics