摘要:本文介绍了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协议实现,二者在传输的原理上存在很大的差异。以下将结合源代码对它们的实现做简单介绍,相信读者会从中有所收获。以下程序已经调试通过。调试的环境: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>。通过使用这个元素,浏览器会自动生成一个输入框和一个按钮,输入框可供用户填写本地的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。具体的表单实现如下:

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

  当选择了粘贴文件后就直接输入本地文件的绝对路径,表单的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()方法很有用。例如,上传我的文档\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 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服务器的设置。用户可根据实际情况选择使用两种方式。登录完成后使用FtpClient的binary()方法初始化传输方式为字节方式。upload()完成文件的上传功能。创建源文件的文件输入流FileInputStream,将输入流写入到字节数组中,利用TelnetOutputStream的write方法将字节数组中的数据写入到一个网络链接上。由于TelnetOutputStream打开的是FTP服务器上的一个文件,所以数据写入到了目标文件中,这样就完成了文件上传。closeConnect()要求与服务器断开连接。

  以上只是单个文件上传的过程,如果是多个文件可以多次调用此上传过程。由以上两种方式我们可以看出采用FTP协议实现多个文件的上传比较简单,容易实现。利用FTP协议上传文件一般是编写的客户端的程序,服务器端的安全设置会比较复杂;而利用HTTP协议上传文件则是服务器端的应用程序,相对来说安全设置会比较简单。并且通过测试发现FTP上传方式在传输大文件时速度是HTTP上传方式的几十倍甚至几百倍,但在传输小于1M的文件时却比HTTP上传方式稍慢一些。所以说两种传输方式各有优势,请读者根据自身情况量力而行。如果有什么问题或者是需要其他部分的源码,请与我联系!

JavaBean实现多文件上传的两种方法的更多相关文章

  1. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  2. ios – 未捕获的异常:CALayer位置在执行动画时包含NaN

    我在iPad上运行时在应用程序中收到此错误:Uncaughtexception:CALayerpositioncontainsNaN相同的代码在iPhone上运行良好.我知道,分配的帧包含NaN值,我用CGRectEmpty函数检查了这个并将该帧设置为CGRectZero,但它不起作用.我从这里得到了这个工作代码,https://stackoverflow.com/a/7045916/160323

  3. PHP实现文件安全下载

    例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用"Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。feof){echofread;}fclose;}这样就可以用PHP直接输出文件了。

  4. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  5. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  6. PHP实现文件上传与下载实例与总结

    这篇文章主要介绍了PHP实现文件上传与下载实例与总结的相关资料,需要的朋友可以参考下

  7. 小程序实现图片裁剪上传

    这篇文章主要为大家详细介绍了小程序实现图片裁剪上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. Node的文件系统你了解多少

    这篇文章主要为大家详细介绍了Node的文件系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  9. js实现头像上传并且可预览提交

    这篇文章主要介绍了js如何实现头像上传并且可预览提交,帮助大家更好的理解和使用js,感兴趣的朋友可以了解下

  10. 实现“上一页”和“下一页按钮

    offset=$prevoffset\">上一页\n";}//计算页面数$pages=intval;//$pagesnowcontainsintofpagesneededunlessthereisaremainderfromdivisionif{//hasremaindersoaddonepage$pages;}for{//显示页数$newoffset=$limit*;print"

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部