您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页Java Web应用中文件上传的最佳实践

Java Web应用中文件上传的最佳实践

来源:叨叨游戏网
维普资讯 http://www.cqvip.com

本栏目责任编辑:冯蕾 ...。・.网络通讯与安全・ Java Web应用中 文件上传的最佳实践 肖飞。杨海波 (南阳A_T-学院,河南南阳473004) 摘要:文件上传是web应用中常见的要求,而Servlet技术的一个缺憾就是未能提供对文件上传的支持。本文总结了lavaweb应用 中处理上传文件的技巧。这些技巧对于初学者或Webk开发者都具有参考价值。 关键词:文件上传:lava;Web应用 中图分类号:TP312 文献标识码:A 文章编号:1009—3044(2007)09—20687—01 XIAO Fei.YANG Hai.bo Best Practices of File Upload in Java Web Application (Nanyang Institute of Technology,Nanyang 473004,China) Abstract:File upload is a common requirement in Web applications.but the Servlet teChnology cannot support it,This document summary the skills to solve this problem、The skills have the reference value regarding cl1e be nner or Web developers Key words:File Upload;Java;Web application ~ 一  。1前言 在Web应用中经常需要浏览器用户向服务器提交文件。作为 //Create a factory for disk—based file items FileltemFactory factory new DiskFileltemFactory0; //Create a new file upload handler Web应用开发的主流技术,ServledJSP却没有提供对文件上传的 支持。本文通过一个“上传照片”的例子全面总结了实现文件上 传、读取、存储及访问的方法和技巧。在该Web应用中要求将用户 提交的照片信息保存到服务器端。 ServletFileUpload upload=new ServletFileUpload(factory); ||Parse the request List/ FileItem /items=upload.parseRequest(request); FileUpload组件将request输入项解析成FileItem对象的列 表.就可通过迭代访问各个输入项。Fileltem的isFormField方法可 2上传 为了使用户能够向服务器提交标题和照片文件,需要提供一 个HTML表单 以区分输入项是普通表单项还是文件,从而分别处理。 Iterator iter=items.iterator0; while(iter.hasNext0){ FileItem item=fFileItem)iter.nextO; if fitem.isFormField01 f processFormField(item); l else{ processUploadedFile(item);J} 3.2使用Struts中FormBean 在Stutrs框架中使用ActionForm更为简单。为相应的Action 定义一个ActionFom。r import org.apache.stuts.raction.ActionForm; import org.apache.struts.upload.FormFile; 注意,包含文件域的表单method属性必须为post,enctype属 性必须为multipart/ofrm—data。 <form method=”post”enctype=”multipart/form—data”…> <input type=”text”name=”title’’> <input type=”file”name=”picture”>… </form> 当用户提交后,浏览器会将标题和照片文件封装到H1rrP请 求的消息体中,并通过网络发送到Web服务器。 public class LeafForm extends ActionForm{ private String title; private FormFile picture; , 3读取 服务器端如何读取编码类型为multipart/form-data的表单数 据呢?对于普通的输入元素tide,request对象的getParameter方法 返回的总是null:而getlnputStream方法返回的输人流包含title文 public void setTitle(String s){ this.title=s;l 本、picture文件及边界字符,不能直接读出所上传的文件。 3.1使用Commons项目中FileUpload 由于标准Senrlet API中没有提供对这种表单(method为post, enctype为multipart/orfm—data)数据的读取方法.Web程序员需要自 己动手从request输人流中解析出各个输入项。这一工作要求Web public Stirng getTide0f retum this.tide;l public void setPicture(FormFile f){ this.picture= } public FormFile getPicture 0{ retum hits.picture;}】 收到请求以后,Stutrs框架自动完成解析、类型转换,并将输 程序员对HrI] 请求消息格式相当的熟悉,如同早期的CGI程序员 样。Apache软件基金会组织的Commons项目中提供的FileU— pload组件可以帮助Java Web程序员完成这一繁琐的工作。可以从 网站下载需要的文件,并将解压后的iar文件拷贝到当前Web应用 的,ⅣEB—IN聊ib目录下。然后参照相关文档来使用其API。 一入项保存到ActionForm的同名字段中。这里上传文件picture就 暂存在FormFile对象中,通过此对象可以获得picture的文件类 型、大小及文件输入流等。 4保存 4.1保存到文件夹下 将上传的文件存储到当前Web应用的子目录中是一种常见 的选择。假设将上传的picture文件保存到当前Web应用album 的uDload目录中。这里需要考虑两个问题: f] 转第816页) import org.apache.commons.ifleupload.*; import org.apache.commons.ifleupload.disk.*; ・- .. 收稿日期 2007—03—06 ・作者简介:肖飞(1979一),男(汉族),南阳理工学院软件学院助教,学士,主鼍 事JavaWeb应用的教学和开发。杨海波(1979一),男(汉族),南 阳人,南阳理工学院软件学院助教,学士,主要从事网络技术、Web应用的疲学和开发。 887 维普资讯 http://www.cqvip.com

人工智能及识别技术 本栏目责任编辑:李桂瑾 楼层中人们停留时间很短的地方进行控制,如公用厕所、水房等。 kgl<= 0 ;kg2<= 0 ;kg3<= 0 ; end i when s1=> if(call2= 1 1 then kg2<= 1 ;kg1<= 0 ;kg3<= 0 ; else kg2<= 0 ;kg1<= 0 ;kg3<= 0 ; end if; when s2=> if(call3= 1 、then kg3<= 1 ;kg1<= 0 ;kg2<= 0 ; else 图1仿真波形图 kg3<= 0 ;kgl<= 0 ;kg2<= 0 ; end i£ 4结束语 end case; 该电路采用VHDL语言简洁明了的描述了楼梯照明灯控制 end if; 的过程,达至0了设计目的。整个电路只用一片CPLD或者FPGA芯 end process; 片就可以实现,大大简化了外部电路,既减少了大量硬件连线,又 end statemachine; —降低了干扰。系统实现方便、性能稳定。采用VHDL这种与硬件工 3.2仿真验证VHDL程序 艺无关的描述语言,可以适应多家可编程逻辑器件,便于组织大 程序调试在QUATUS 1I软件系统中进行,先将VHDL设计程 规模的系统设计;便于设计的复用继承和升级更新,具有广阔的应 序或原理图输入的文件分别编译、综合、 用前景 仿真,根据CPLD的引脚资源指定引脚,重新编译,最后把sof 参考文献: 或pof文件下载CPLDIFPGA中验证。 [1]范秋华,赵艳秋,何香玲.基于VHDL的彩灯控制[J】.现代 本电路经下载到EDA实验箱.结果正确。仿真结果如图1所 电子技术,2004,169(2):5—8. 示。 [2]姜雪松,刘东升.硬件描述语言VHDL教程[M].西安:西安 3.3实例扩展 . 交通大学出版社.2004. 该程序是对三层楼的照明灯的控制,在实际生活中,可以通 【3]张亦华,延明.数字电路EDA入f-I[M].北京:北京邮电大学 过修改输入信号和输出信号对多层楼进行控制,另外,也可以对 出版社.2003。 (上接第687页) Web服务器的发布目录之外,则需要提供一个Servlet或JSP使用 (11如何获得/album/upload的路径? 文件流读取该文件并传送给客户端。 如果使用开发者机器的实际路径的话,则在将Web应用部署 5.2显示数据库中的文件 到其它机器前必须修改这一路径。这样比较麻烦。常见的做法是 假设照片文件存储在数据库表album的一个BLOB字段中, 使用 tSen,letC0ntext()。getRealpath(“/upload”)来获得该路径。 可使用下面的JSP显示照片。 ・f21如何给文件命名以避免文件覆盖? <%@page contentType=”image ̄peg“%> 可以考虑使用文件上传前的名字,但须注意的是如果重名的 <%@page import=”java。awt。image. .con.sun.image.codec.jpeg。 话,新上传的文件会覆盖已有文件。常见的做法是使用数据库ID javax。imageio.*,java.io。 ,java。sql。 ,myProject。db。DatabaseConnec・ 或时间来重新命名上传文件,保留文件上传前的后缀名。 tion”%> <% Connection con null; InputStream in=£getInputStream0; try( Stirng path getServletContext0。getRealPath(”/upload“1: Stirng id=request。getParameter(”id”1; String filename:new Date().getTime0+‘‘”: Con:DatabaseConnection。getC0nnecti0n(); Stirng suffix:originalName.substring(0riginalName。lastIndexOf Statement stmt:con。createStatement0; ( . )); ResultSet rs stmt.executeQuery select pic from album where FileOutputStream out=new FileOutputStream rpath+”/” + id=”+id1: filename+sufifx); if( ̄s。nextO){ mt C; BufferedlnputStream inputimage:new BufferedlnputStream while((c=in.read())!:-1)( (rs.getBinaryStream(1)); out write(c);}…・-- Bufferedlmage image:ImageIO.read(inputimage); 4.2保存到数据库中 JPEGC0dec.createJPEGEncoder(response。getOutputStream()). 也可以把上传文件存储到数据库的BLOB字段中。这里需要 encode(image);} 使用JDBC的预编译语句PreparedStatemem对象。 }catch(Excepti0n ex)【l ifnally( Stirng insert:“INSERTINTOalbum(title,picture)VALUES (…?,?)…”; .。 .‘ if(con!=nul1)( con。close();II %> PreparedStatement pstmt:con.prepareStatement(insetr); pstmt。setString(1,tide); 6结论 pstmt.setBinaryStream(2,f,getInputStream0,f.getFileSize0); 文件上传是Java Web应用中一个非常重要的技巧,通过使 用第三方类库或框架可以很容易的弥补Servlet技术的缺憾。你还 5访问 可以使用10包或JDBC轻松完成对上传文件的处理。 5.1显示文件夹中的文件 参考文献: 如果上传的文件保存在Web服务器的发布目录或子目录之 [1][DB/OL].http://jakarta.apache.org/commons 下,则可以直接通过URL访问该文件。如果上传的文件保存在 [2][DB/OL].http://struts.apache.org. 81 6 电脑知识与技术 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务