微博上传的视频清晰教程 Struts1.x系列教程(8):上传单个文件
Struts1.x系列教程(8):上传单个文件
在Web程序中的上传文件的功能一般会使用<input type=file……/>标签在客户端显示输入要上传的文件名的用户接口 如果读者使用过JSP/Servlet来处理客户端上传的文件就会知道 实现这个功能并不是很容易 而在Struts中为我们提供了一种机制 可以非常方便地将客户端上传的文件保存在服务端
在Struts Html标签库中提供了一个< file>标签 可以和FormFile类型的属性一起使用 通过这个属性返回的FormFile对象 就可以很方便地获得上传文件的InputStream对象 并做进一步地处理
在Struts中 一个FormFile对象代表一个上传的文件 FormFile实际上是一个接口 我们可以在 apache struts upload包中找到这个接口 FormFile接口有如下五个常用的方法
getInputStream()方法
这个方法用于获得上传文件的java io InputStream对象 我们可以从这个InputStream对象中读取上传文件的数据 并将其写到服务端指定的路径下
getFileData()方法
这个方法用于将上传文件的整个内容放到一个byte类型的数组中 如果上传文件的尺寸比较小的话 使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中
getFileName()方法
这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)
getFileSize()方法
这个方法用于获得上传文件的字节数
destroy()方法
用于销毁所有和当前上传文件相关的资源
下面的例子演示了如何使用< file>标签和FormFile对象来上传单个文件 实现这个例子需要如下六步
【第 步】建立上传文件的JSP页面
在<samples工程目录>目录中建立一个uploadFile jsp文件 代码如下
<%@ page pageEncoding= GBK %> <%@ taglib uri= prefix= %> <> <head> <title>上传单个文件(文件大小不能超过 M) </title> </head> <body><% 在<:form>标签中必须加enctype= multipart/form data %> <:form enctype= multipart/form data action= uploadFile > <:file property= myFile /><p> <% 使用<:file>标签让用户输入上传文件名 %> <:submit value= 上传 /> </:form> </body> </>
【第 步】建立ActionForm的子类 在<samples工程目录> src actionform目录中建立一个UploadForm java文件 代码如下
package actionform; import apache struts action *; import apache struts upload FormFile; public class UploadForm extends ActionForm { private FormFile myFile; // 这个myFile代表要上传的文件 public FormFile getMyFile() { return myFile; } public void setMyFile(FormFile myFile) { this myFile = myFile; } }
【第 步】建立Struts动作类(Action的子类) 在Struts中 一般在Struts的动作类中处理上传的文件 在<samples工程目录> src action目录中建立一个UploadAction java文件 代码如下
package action; import javax servlet *; import apache struts action *; import apache struts upload FormFile; import java io *; import actionform *; public class UploadAction extends Action { protected void saveFile(FormFile formFile) throws Exception { // 从web xml文件中获得指定的上传路径 String path = this getServlet() getServletConfig() getInitParameter( uploadPath ); InputStream in = formFile getInputStream(); // 获得上传文件的InputStream // 在服务端指定的上传路径中建立一个空的文件(文件名为getFileName()方法返回的值) FileOutputStream fout = new FileOutputStream(path + formFile getFileName()); byte buffer[] = new byte[ ]; int count = ; // 开始向上传路径中刚建立的文件写入数据 每次写 k字节 while ((count = in read(buffer)) > ) { fout write(buffer count); } fout close(); formFile destroy(); // 上传成功后 销毁当前上传文件的资源 } public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) { UploadForm uForm = (UploadForm) form; PrintWriter out = null; try { response setCharacterEncoding( GBK ); out = response getWriter(); saveFile(uForm getMyFile()); // 将上传文件保存到指写的路径(在web xml中配置) out println( 上传文件成功 ); } catch (Exception e) { out println(e getMessage()); } return null; } }
在saveFile方法中 首先从web xml的Servlet初始化参数中获得一个用于保存上传文件的路径 然后从FormFile对象中获得上传文件的InputStream对象 并对这个InputStream对象中的字节进行循环读取 并写到新的文件中 最后 在上传成功后 将FormFile对象销毁
【第 步】配置struts config xml
在这一步来配置一下在第 步和第 步分别建立的ActionForm和Action的子类 打开struts config xml文件 在<form beans>中加入如下的子标签
<form bean name= uploadForm type= actionform UploadForm />
在<action mappings>中加入如下的子标签
<action name= uploadForm path= /uploadFile scope= request type= action UploadAction />

【第 步】设置用于保存上传文件的路径
打开web xml文件 找到一个叫action的Servlet(也就是用于处理Struts动作的Servlet) 并在<servlet>中加入如下的子标签(假设保存上传文件的路径为D: upload 路径的最后一个字符必须是 )
<init param> <param name>uploadPath</param name> <param value>D:upload</param value></init param>
【第 步】限制上传文件的大小 这一步是可选的 如果不限制上传文件的大小 就意味着可以上传任意大小的文件 而一般的应用程序 如电子相册 网络硬盘都会限制上传文件的最大尺寸
打开struts config xml文件 在<struts config>中加入如下的子标签
<controller maxFileSize= M />
lishixinzhi/Article/program/Java/ky/201311/28912