Servlet文件上传

2009-11-29 15:24

servlet实现文件上传

转载: 在Web 应用程序中,用户向服务器上传文件是很是广泛的操做。使用Servlet 实现文件的上传是比较简单的。 编程思路:下面的UploadServlet.java ,其主要功能为从InputStream 中读取文件内容,将上传文件保存在根目录下,且文件名与上传文件的文件名一致。 UploadServlet.java 的源代码以下:(代码节选) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class UploadServlet extends HttpServlet { //default maximum allowable file size is 1000k static final int MAX_SIZE = 1024000; //instance variables to store root and success message String rootPath, successMessage; /** * init method is called when servlet is initialized. */ public void init(ServletConfig config) throws ServletException { super.init(config); //get path in which to save file rootPath = config.getInitParameter("RootPath"); if (rootPath == null) { rootPath = "/"; } /*Get message to show when upload is complete. Used only if a success redirect page is not supplied.*/ successMessage = config.getInitParameter("SuccessMessage"); if (successMessage == null) { successMessage = "File upload complete!"; } } /** * doPost reads the uploaded data from the request and writes * it to a file. */ public void doPost(HttpServletRequest request, HttpServletResponse response) { ServletOutputStream out=null; DataInputStream in=null; FileOutputStream fileOut=null; try { /*set content type of response and get handle to output stream in case we are unable to redirect client*/ response.setContentType("text/plain"); out = response.getOutputStream(); //get content type of client request String contentType = request.getContentType(); out.println("\ncontentType= " + contentType); //make sure content type is multipart/form-data if(contentType != null && contentType.indexOf( "multipart/form-data") != -1) { //open input stream from client to capture upload file in = new DataInputStream(request.getInputStream()); //get length of content data int formDataLength = request.getContentLength(); out.println("\nContentLength= " + formDataLength); //allocate a byte array to store content data byte dataBytes[] = new byte[formDataLength]; //read file into byte array int bytesRead = 0; int totalBytesRead = 0; int sizeCheck = 0; while (totalBytesRead < formDataLength= { //check for maximum file size violation sizeCheck = totalBytesRead + in.available(); if (sizeCheck > MAX_SIZE) { out.println("Sorry, file is too large to upload."); return; } …. …. } 编程技巧说明: 首先定义上传文件最大字节为1024K(1M),上传文件保存在根目录(/)下,从请求的InputStream 读取实体数据,根据请求头Content-Type 和contenLength 等值,从实体数据中解析出表单Form 数据中的filename 和Content-Type 等值,而后将实体数据中真正属于上传文件的内容保存到服务器上的根目录文件中。 其中用到涉及中文输出: String fileStr=new String(dataBytes,"ISO8859_1"); fileOut=new FileOutputStream(rootPath+fileName); fileOut.write(fileStr.getBytes("ISO8859_1"),0,fileStr.legth()); UploadFile.html 的源代码以下: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80"> <title>Upload a File</title> </head> <body> <h1>文件上传 </h1> <h2>提示:您的浏览器必须能支持文件上传!</h2> <form action="servlet/uploadServlet" method="POST" enctype="multipart/form-data"> <div align="left"> <pre>发送文件:<input type="file" size="40" name="upl-file"> </BR> <input type="submit" value="开始发送" now> <input type="reset" value="重 设"></pre> </div> </form> </body> </html> 小结: (1) Servlet 编程要求读者已经掌握了Java 语言程序设计,最好对面向对象也有必定的了解。Java 语言程序设计最主要的是对Java 的类库的使用,一样掌握Servlet 编程也要求熟练使用Sun 公司提供的JSDK。 (2) 一个好的Servlet 程序必需要考虑得全面。因为Servlet 在服务器上执行,为客户提供服务,有时可能会有多个客户同时向一个服务器发请求,这就要求Servlet 程序必须可以保证良好的并发性。容许Servlet 并发执行,就要解决Servlet 中变量和同步访问以及共享的问题,尤为要特别注意服务器的一些昂贵的资源。另外一方面,Servlet 要把处理结果返回给客户,要求Servlet 充分考虑响应的速度和响应结果的简洁明了,同时对客户的错误请求有必定的容错性。 (3) 解决Servlet 中文输出问题 当Servlet 输出的文档中有中文时,须要在Servlet 中使用下面的语句来指明: response.setContentType("text/html;charset=gb2312"); 在JSP中使用: <%@page contentType="text/html;charset=gb2312"%> 这二者是等效的。 若是在Servlet 中文显示有问题,可从如下几方面来考虑: * 修改区域设置---在控制面板中选择区域设置,如设为英语(美国)。 * 在编译Servlet 时加入代码选项,如:javac -encoding iso8859-1 ghqServlet.java * 在源程序中加入编码转换函数,如:out.println(new String("请输入用户名").getBytes("GBK"),"ISO8859_1")); 或者使用下面的方法: String Str="请输入用户名";Byte[] tempByte=Str.getBytes("ISO8859_1");String tempStr=new String(tempByte); 这样tempStr 中的中文就能够正确显示了。 因为Servlet 采用不一样的引擎,其中文的解决方法可能不一样;所以,当出现中文显示问题时,建议必定要多实验,最终总会获得解决。 (4) Java Servlet 程序弥补了 Applet 程序的不足, Servlet 主要应用在HTTP Servlet 接收请求(HttpServletRequest接口)和产生响应(HttpServletResponse接口)、使用Cookies 及会话管理(HttpSession 接口)应用、Java Servlet 在网络上的编程应用如利用Servlet 上传和下载文件、Servlet 的数据库编程、在Servlet 中发送和接受邮件以及Java Servlet 在RMI和XML等方面的应用,所以Servlet 的编程应用仍是比较普遍的。 一般 Servlet 能够使用如下的方法调用: * 客户经过访问 Servlet 产生的文档来调用 Server 获得一个访问文档的请求后,查找配置参数,就会发现所需文档不是一个静态文档,而是由 Servlet 对象产生的,因而服务器就会把请求传给 Servlet,Servlet 调用 "service" 方法产生输出。这种方法与传统的调用 CGI 的方法相似。 * 直接经过 URL 调用 Servlet 客户(浏览器)使用如下格式的 URL 调用: http://Servlet_Host_Name/servlet/<servlet URL> <servlet URL>是指向 Servlet 位置的普通的URL,它的格式以下所示: name?para1=value1&para2=value2... 其中,name 是 Servlet 的名字,"?" 后面跟的是一串参数,para1 是第一个参数名,value1是它的值,para1 是第二个参数名,value2是它的值,以此类推。一般Servlet 存放的位置可能与服务器不在同一台机器上,这时服务器就要动态加载、初始化和执行Servlet 类。 * 经过 SSI(Server-Side Includes) 标志调用 任何一个以.sthml 为扩展名的文件都是服务器要分析的文件。在该文件中,若是出现了Servlet标志,那么服务器就会运行该Servlet,并把它的输出结果插入标志所指示的地方。 * 把 Servlet 放在/servlet/目录下 若是一个 Servlet 的类文件被放在/servlet/目录下,那么就能够直接使用它的类名调用它。 * 经过 Filter Chain 调用 这种方法通常要把 Servlet 配置成当一个特定的 MIME 类型被设置为响应时再调用。 但Servlet 也有它的缺点: * 在复杂的HTML 网页中,加入的动态部分若是用Servlet 来处理的话,那对程序员来讲简直是一场噩梦。 * Servlet 要进行编译、放入执行码等复杂的调用过程。 正是因为Servlet存在的缺点,才出现使用JSP 技术来解决上面的问题,这也正是JSP 的优势。
相关文章
相关标签/搜索