JSP上传方法总结

上传人:阳*** 文档编号:95533974 上传时间:2022-05-24 格式:DOC 页数:22 大小:110.50KB
收藏 版权申诉 举报 下载
JSP上传方法总结_第1页
第1页 / 共22页
JSP上传方法总结_第2页
第2页 / 共22页
JSP上传方法总结_第3页
第3页 / 共22页
资源描述:

《JSP上传方法总结》由会员分享,可在线阅读,更多相关《JSP上传方法总结(22页珍藏版)》请在装配图网上搜索。

1、(.do)(Struts 文件上传(UpLoad))(用JSP实现上传文件的两种方法)文件上传原理简单实现要实现文件上载,我们必须先了解上载文件的HTTP请求。下面这个简单的应用示范了如何上载文件以及把HTTP请求的原始数据写入文件。用文本编辑器查看该文件即可了解请求的格式,在此基础上我们就可以提取出上载文件的名字、文件内容以及原本混合在一起的其他信息。在这里我们写一个简单的html页面up.html,提供一个表单,用户从这里选择文件并把文件上载到服务器。文件上载公司:选择要上载的文件注意,标记有一个enctype属性,属性值是MULTIPART/FORM-DATA。还有个type为file的

2、输入框是用来选择上传文件的。表单的action属性值是upjsp.jsp,这是将请求发送给upjsp.jsp文件。upjsp.jsp调用了名为UpBean的JavaBean。程序如下:下面是UpBean的实现代码:importjava.io.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.ServletInputStream;publicclassUpBeanpublicvoiddoUpload(HttpServletRe

3、questrequest)throwsIOExceptionPrintWriterpw=newPrintWriter(newBufferedWriter(new(test.txt);ServletInputStreamin=request.getInputStream();inti=in.read();while(i!=-1)pw.print(char)i);i=in.read();pw.close();这个JavaBean把HttpServletRequest对象的表单原始数据写入test.txt文件.选择上传一个文本或者网页文件。点击“上载”按钮之后,表单就发送给了upjsp.jsp文件,

4、一起发送的还有上传的文件。upjsp.jsp文件不会向浏览器发送任何应答内容,但它会生成一个test.txt文件。打开test.txt文件,我们可以看到上传文件的内容和一些上传的信息了。null JavaBean实现多文件上传的两种方法作者:文章来源:发布日期:2007年01月13日摘要:本文介绍了JavaBean实现多个文件上传的两种方法,分别是使用http协议和ftp协议实现。首先讲述了http协议传送多个文件的基本格式和实现上传的详细过程,之后简单介绍了使用 类实现了ftp方式的上传,最后对这两种方法进行了比较。关键字:JavaBean 、http 、ftp 、JavaBean是一种基于

5、Java的软件组件。JSP对于在Web 应用中集成JavaBean组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经测试和可信任的已有组件,避免了重复开发),也为JSP应用带来了更多的可伸缩性。文件的上传功能在基于B/S的开发模式中非常普遍。同其他开发工具相比较,JSP对文件的上传支持并不是很完美,它既不象ASP那样一定需要使用组件来完成,也不像PHP那样直接提供了文件上载的支持。JSP实现文件上传的实现方式是这样的:使用ServletRequest类的getInputStream()方法获得一个客户端向服务器发出的数据流,然后处理这个数据流,从中分析、得到文件上传中传递到服务器

6、的各个参数和数据,然后将其中的文件数据存储为一个文件或插入到数据库中。通常JSP页面中不处理文件的上传功能,而是把这些功能放到Servlet 或JavaBean中去实现。使用Servlet完成文件上传的例子在一些JSP的相关书籍中都有所介绍,我这里介绍使用JeanBean是如何完成文件上传的。JSP中实现文件的上传可以采用两种方式即采用HTTP协议和FTP协议实现,二者在传输的原理上存在很大的差异。以下将结合源代码对它们的实现做简单介绍,相信读者会从中有所收获。以下程序已经调试通过。调试的环境:window 2000 server+Apache +tomcat4.0,JavaBean调试环境:

7、JDK1.4+Editplus。在JSP中使用JavaBean实现基于Web的文件上传功能一般需要三种文件结合完成。这三种文件分别是提供界面的HTML页面文件、完成调用实现上传功能的JavaBean的JSP文件和实现JavaBean的Java的类文件。以下我将重点讲述采用HTTP协议和FTP协议实现文件上传功能的JavaBean部分。1 采用HTTP协议实现多个文件的上传在过去的Html中,表单不能实现文件的上传,这多少限制了一些网页的功能。RFC1867规范(即Html中实现基于表单的文件上传)对表单作出了扩展,增加了一个表单元素input typefile。通过使用这个元素,浏览器会自动生

8、成一个输入框和一个按钮,输入框可供用户填写本地的文件名和路径名,按钮可以让浏览器打开一个文件选择框供用户选择文件。具体的表单实现如下:終当选择了粘贴文件后就直接输入本地文件的绝对路径,表单的action属性值是*.jsp,这意味着请求(包括上载的文件)将发送给*.jsp文件。在这个过程中实际上就实现了HTTP方式的文件上载。文件从客户端到服务器的上载是由HTTP协议的通用网关界面(CGI)支持的。这种上载方式要求浏览器和WEBServer两方面都能够支持Rfc1867。JavaBean 通过ServletRequest类的getInputStream()方法获得一个客户端向服务器发出的数据流、

9、分析上传的文件格式,根据分析结果将多个文件依次输出服务器端的目标文件中。本例中的JavaBeande的功能是由testUpload类具体实现。TestUpload类的框架如下:public class testUploadpublic testUpload()public final void initialize(ServletConfig config) throws ServletException m_application = config.getServletContext(); public void upload() throws testUploadException, IO

10、Exception, ServletExceptionprivate void getDataSection()private void getDataHeader()public int save (String destPathName)throws SmartUploadException, IOException, ServletException 通过initialize()方法初始化Servlet的运行环境。使用upload()方法获得输入流,并分析上传文件的格式,并将各个上传文件的属性赋给多个File类实例处理,这些File类实例由Files类管理。File类根据各文件的属性调用

11、它的save ()方法将多个文件依次输出服务器端的目标文件中。其中upload()方法是关键,用于分析http1.1协议传送文件的格式。经过测试,我们得出传输流文件的格式,这对理解upload()方法很有用。例如,上传我的文档 t.txt文件。格式如下:/文件分隔符-7d226137250336 /文件信息头Content-Disposition: form-data; name=FILE1; C:Documents and SettingsAdministrator.TIMBER-4O6B0ZZ0My Documents t.sqlContent-Type: text/plain/源文件内容

12、 create table info(content image null);/下一个文件的分隔符-7d226137250336Content-Disposition: form-data; name=FILE2; Content-Type: application/octet-stream-7d226137250336 从以上文件我们可以看出,HTTP协议在上传多个文件时,是将文件全部放到输入流并以一定的分隔符来区分的。实际上upload()方法就是要分析上面的文件,确定分隔符的内容、各个文件的内容格式、文件的完整路径名称、及其文件的实际数据的始末位置。这里需要说明的一点是分隔符是随机的,它

13、是传输流文件的第一个回车符之前的所有字符。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)

14、 throw new SmartUploadException(Unable to upload.); 这里采用了循环中多字节读取方法,以上循环不断地读取数据直到数组填满为止。如果一个文件可以完全得到,则文件的所有字节也就可以全部得到。但是因为网络速度通常比CPU慢得多,所以程序很容易在所有的数据到来之前就清空网络缓冲区。实际上,多字节读取方法在试图从暂时为空但是开放的网络缓存区读取数据时,该方法会返回0,这表示没有数据存在但网络流没有关闭。这种情况下,单字节方法将阻止运行程序的执行,所以多字节的行为优于单字节read()方法的行为。接下来将分析字节数组m_binArray。首先找到分隔符;使

15、用getDataHeader()方法返回文件信息头的值,从中确定源文件的完整路径名、源文件的扩展名和源文件文件内容格式;使用getDataSection()方法返回文件的内容数据,并记录文件数据在字节数组中的起止位置。然后生成一个File类实例,并将文件的完整路径名、源文件的扩展名、源文件文件内容格式和文件的内容数据的起止位置放到File类实例的属性中。找到下一个分隔符,继续重复上述过程,直至分析完毕。2 采用FTP协议实现多个文件的上传FTP协议是Internet上用来传送文件的协议,规定了Internet上文件互相传送的标准。在java中实现这一功能是借助类完成的。具体实现过程:首先与FT

16、P服务器建立连接;初始化文件的传输方式,包括ASCII和BINARY两种方式;将文件输出到文件输入流中;中的数据读入字节数组中;字节数组中的数据写入输出流TelnetOutputStream(利用write方法将数据写入到一个网络链接上)。这样和源文件同名的一个文件就复制到了服务器端。本例的JavaBean中通过connectServer()、upload()和closeConnect()三个方法完成文件上传过程。主要实现如下:public class String ;public void connectServer(string server,string user,string pass

17、word,string path)/server:FTP服务器的IP地址;user:登录FTP服务器的用户名/password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径try ();(server);(user, password);System.out.println(login success!);if (path.length()!=0) (path);(); catch (IOException ex) System.out.println(ex);public void closeConnect()try ();catch (IOException ex) Sy

18、stem.out.println(ex);public void upload() ();/从中分析出文件的名称,作为目标文件的名称,具体方法实现未给出try TelnetOutputStream os=();java.io. java.io.); is=new ();byte bytes=new byte1024;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(

19、)完成与FTP服务器建立连接的功能,使用的openServer(string server)方法打开远程FTP服务器,然后使用的login(user, password)方法登录服务器。登录远程FTP服务器有两种方式,一种是注册用户登录,另一种是以匿名方式登录。前者要求用户首先注册为服务器的客户,服务器会给客户一个登录账号和密码,依据账号和密码连结到服务器上。后者要求用户不用注册而使用特殊的用户名annoymous和guest有限制的访问远程主机的公开文件,现在许多系统要求用户将Email地址作为口令。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载文件,而不允许上传,这将依赖于FT

20、P服务器的设置。用户可根据实际情况选择使用两种方式。登录完成后使用的binary()方法初始化传输方式为字节方式。upload()完成文件的上传功能。创建源文件的文件输入流,将输入流写入到字节数组中,利用TelnetOutputStream的write方法将字节数组中的数据写入到一个网络链接上。由于TelnetOutputStream打开的是FTP服务器上的一个文件,所以数据写入到了目标文件中,这样就完成了文件上传。closeConnect()要求与服务器断开连接。以上只是单个文件上传的过程,如果是多个文件可以多次调用此上传过程。由以上两种方式我们可以看出采用FTP协议实现多个文件的上传比较简

21、单,容易实现。利用FTP协议上传文件一般是编写的客户端的程序,服务器端的安全设置会比较复杂;而利用HTTP协议上传文件则是服务器端的应用程序,相对来说安全设置会比较简单。并且通过测试发现FTP上传方式在传输大文件时速度是HTTP上传方式的几十倍甚至几百倍,但在传输小于1M的文件时却比HTTP上传方式稍慢一些。所以说两种传输方式各有优势,请读者根据自身情况量力而行。如果有什么问题或者是需要其他部分的源码,请与我联系! 用JSP编写文件上传作者:未知文章来源:发布日期:2005年01月19日袁毅:2000-10-23 如果你曾用VB编写文件上传的组件的话,那么用JAVA编写文件上传的JAVABEA

22、N十分容易。下面的例子只是一个简版package yuanyifileup;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.PageContext;public class yuanyifileupprivate ServletRequest request;private ServletResponse response;private ServletConfig config;ServletInputStream D

23、ATA;int FormSize; os;DataInputStream is;String ;byte b;byte t;boolean flag=false;public yuanyifileup() public void initialize(ServletConfig config,HttpServletRequest request,HttpServletResponse response) throws IOExceptionthis.request=request;this.response=response;this.config=config;DATA = request.

24、getInputStream();FormSize=request.getContentLength();public void initialize(PageContext pageContext) throws IOExceptionrequest=pageContext.getRequest();response=pageContext.getResponse();config=pageContext.getServletConfig();DATA = request.getInputStream();FormSize=request.getContentLength();public

25、boolean set(String s)try File(s);os=new (f1);catch(IOException e)return(false);return(true);public void getByte()int i=0;tryis=new DataInputStream(DATA);b=new byteFormSize;while (true)tryt=is.readByte();bi=t;i+;catch(EOFException e) break;is.close();catch(IOException e)public boolean save()int i=0,s

26、tart1=0,start2=0;String temp=;if (!flag)getByte();flag=true;trytemp=new String(b,ISO8859_1);catch(UnsupportedEncodingException e)return(false);start1=temp.indexOf(image/);temp=temp.substring(start1);start1=temp.indexOf( );temp=temp.substring(start1+4);start2=temp.indexOf(; );if (start2!=-1)temp=temp

27、.substring(0,start2); trybyte img=temp.getBytes(ISO8859_1);for (i=0;iimg.length;i+) os.write(imgi); os.close();catch(IOException e)return(false);return(true);如果有不明白的发E-Mail:yymailbo.Bye 关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端 servlet的方式,利用JSP上传文件,你也可以完全在jsp中实现而不用servlet.在开

28、始JSP上传文件之前你要准备以下几个东西:1. commons- 1.2 包 下载地址:2. commons-IO 1.3.1 包 下载地址:3. Commons-BeanUtils 1.7 包 下载地址:有了上面这些东西我们就可以开始了1. 新建一个叫upload的WEB项目(我用的是Lomboz3.2开发环境)2. 把上面下载下来的包分别解压并拷贝*.jar的文件到上面那个项目的WEB-INF/lib目录中3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,1. 2. 3. Jsp+Servletupload4. 5. 6. 7. 8. 9. 10. 11.

29、12. 13. 14. 上面文件中有几个需要注意的地方就是1. action=UploadServlet 必须和后面的web.xml配置文件中对servlet映射必须保持一致.2. method=POST 这里必须为POST方式提交不能是GET.3. enctype=multipart/form-data 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.4. 表示你要3个文件一起上传,你也可以一次只上传一个文件.接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java吧以下是该servlet的详细代码:看上去有点

30、长,不过并不复杂,很容易明白的.1. importjava.io.BufferedInputStream; 2. importjava.io.BufferedOutputStream; 3. importjava.io.File; 4. importjava.io.; 5. importjava.io.IOException; 6. importjavax.servlet.ServletException; 7. importjavax.servlet.http.HttpServletRequest; 8. importjavax.servlet.http.HttpServletRespons

31、e; 9. 10. impormons.; 11. impormons.; 12. impormons.; 13. impormons.; 14. impormons.; 15. impormons.; 16. impormons.; 17. 18. /* 19. *ServletimplementationclassforServlet:UploadServlet 20. * 21. */ 22. publicclassUploadServletextendsjavax.servlet.http.HttpServletimplementsjavax.servlet.Servlet 23. =

32、null;/初始化上传文件的临时存放目录 24. =null;/初始化上传文件后的保存目录 25. publicUploadServlet() 26. super(); 27. 28. 29. protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException 30. doPost(request,response); 31. 32. 33. protectedvoiddoPost(HttpServletRequestrequest,HttpSer

33、vletResponseresponse)throwsServletException,IOException 34. try 35. if(Servlet(request) 36. Diskdff=newDisk();/创建该对象 37. dff.setRepository(tmpDir);/指定上传文件的临时目录 38. dff.setSizeThreshold(1024000);/指定在内存中缓存数据大小,单位为byte 39. Servletsfu=newServlet(dff);/创建该对象 40. sfu.set(5000000);/指定单个上传文件的最大尺寸 41. sfu.se

34、tSizeMax(10000000);/指定一次上传多个文件的总尺寸 42. fii=sfu.getItemIterator(request);/解析request请求,并返回集合 43. while(fii.hasNext() 44. fis=fii.next();/从集合中获得一个文件流 45. if(!fis.isFormField()&fis.getName().length()0)/过滤掉表单中非文件域 46. String=fis.getName().substring(fis.getName().lastIndexOf();/获得上传文件的文件名 47. BufferedInpu

35、tStreamin=newBufferedInputStream(fis.openStream();/获得文件输入流 48. BufferedOutputStreamout=newBufferedOutputStream(new(new);/获得文件输出流 49. Streams.copy(in,out,true);/开始把文件写到你指定的上传文件夹 50. 51. 52. response.getWriter().println(successfully!);/终于成功了,还不到你的上传文件中看看,你要的东西都到齐了吗 53. 54. catch(Exceptione) 55. e.prin

36、tStackTrace(); 56. 57. 58. 59. publicvoidinit()throwsServletException 60. /*对上传文件夹和临时文件夹进行初始化 61. * 62. */ 63. super.init(); 64. StringtmpPath=c:tmpdir; 65. StringsavePath=c:updir; 66. tmpDir=new); 67. saveDir=new); 68. if(!tmpDir.isDirectory() 69. tmpDir.mkdir(); 70. if(!saveDir.isDirectory() 71. s

37、aveDir.mkdir(); 72. 73. upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:1. 2. UploadServlet3. UploadServlet4. 5. 6. UploadServlet7. /UploadServlet8. 写好以后再点击保存把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入怎么样看到JSP上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有

38、对.好了,现在我们点击页面上的浏览按钮,找到我们要上传的文件,最后点击Submit,太激动了,还不看一下你的c:updir里面有没有你要的东西. Jsp上传文件说明:没有解决中文乱码问题 smartUpload是一个比较方便的上传文件的组件,利用它几行代码就可以将文件上传到服务器,这里是我写得一个简单的上传文件代码,经测试可以使用,smartUpload特别使用语上传文件比较小的时候,当文件比较大,超过三十兆的时候有可能就会出现异常,这是需要我们注意的地方。 上传页面代码: Html代码 1. 2. 6. 7. 8. 9. 10. basehref=11. 12. 13. 14. 15. 16

39、. 17. 18. 19. !- 20. 21. -22. 23. 24. 25. 26. formaction=/upCl.jspmethod=postenctype=multipart/form-data27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. base href= !- form action=/upCl.jsp method=post enctype=mult

40、ipart/form-data 上传文件的处理jsp代码: Java代码 1. 2. 6. 7. 8. 9. 10. basehref= 11. 12. MyJSPupCl.jspstartingpage 13. 14. 15. 16. 17. 18. !- 19. 20. - 21. 22. 23. 24. 25. % 26. /得到一个SmartUpload对象 27. SmartUploadsu=newSmartUpload(); 28. /上传下载前的初始化方法 29. su.initialize(pageContext); 30. /设置不可以上传的文件后缀列表,没有后缀名的文件也不

41、能上传,用,来表示 31. StringdenieddList=exe,bat,; 32. su.setDenied(denieddList); 33. /设置可以上传的文件 34. StringallowedList=doc,txt,jpeg,png,bmp,rar,zip,pdf,chm; 35. su.setAllowed(allowedList); 36. /设定单个文件的最大值不超过10兆 37. su.setMax(1024*1024*10); 38. su.upload(); 39. Files(); 40. for(inti=0;i();+i) 41. (i); 42. /判断有没有上传文件 43. if() 44. continue; 45. 46. String(); 47. Stringext=(); 48. String(); 49. Stringsize=()+; 50. String(); 51. out.println(文件信息:); 52. out.println(文件全路径名:+); 53. out.println(文件名+); 54. out.println(字段名:+); 55. out.println(文件后缀名:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!