Struts1.x系列教程(8):上传单个文件

转载 2011年09月07日 10:07:16

在Web程序中的上传文件的功能一般会使用<input type=file……/>标签在客户端显示输入要上传的文件名的用户接口。如果读者使用过JSP/Servlet来处理客户端上传的文件就会知道,实现这个功能并不是很容易。而在Struts中为我们提供了一种机制,可以非常方便地将客户端上传的文件保存在服务端。

    在Struts Html标签库中提供了一个<html:file>标签,可以和FormFile类型的属性一起使用。通过这个属性返回的FormFile对象,就可以很方便地获得上传文件的InputStream对象,并做进一步地处理。

    在Struts中,一个FormFile对象代表一个上传的文件。FormFile实际上是一个接口,我们可以在org.apache.struts.upload包中找到这个接口。FormFile接口有如下五个常用的方法:

    1. getInputStream()方法

    这个方法用于获得上传文件的java.io.InputStream对象,我们可以从这个InputStream对象中读取上传文件的数据,并将其写到服务端指定的路径下。

    2. getFileData()方法

    这个方法用于将上传文件的整个内容放到一个byte类型的数组中,如果上传文件的尺寸比较小的话,使用这个方法可以很方便地将上传文件保存到在服务端的指定路径中。

    3. getFileName()方法

    这个方法用于获得上传文件的文件名(不包括文件在客户机的路径部分)。

    4. getFileSize()方法

    这个方法用于获得上传文件的字节数。

    5. destroy()方法

    用于销毁所有和当前上传文件相关的资源。

    下面的例子演示了如何使用<html:file>标签和FormFile对象来上传单个文件。实现这个例子需要如下六步:

    【第1步】建立上传文件的JSP页面

    在<samples工程目录>目录中建立一个uploadFile.jsp文件,代码如下:

  <%@ page pageEncoding="GBK"%>
  
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
  
<html>
    
<head>
      
<title>上传单个文件(文件大小不能超过2M) </title>
    
</head>
    
<body>
<%-- 在<html:form>标签中必须加enctype="multipart/form-data"  --%>
      
<html:form enctype="multipart/form-data" action="uploadFile"> 
        
<html:file property="myFile"/><p>  <%-- 使用<html:file>标签让用户输入上传文件名  --%>
        
<html:submit value="上传"/>
      
</html:form>
    
</body>
  
</html>

    【第2步】建立ActionForm的子类

    在<samples工程目录>"src"actionform目录中建立一个UploadForm.java文件,代码如下:

  package actionform;
  
  
import org.apache.struts.action.*;
  
import org.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;
      }
  }

【第3步】建立Struts动作类(Action的子类)

    在Struts中,一般在Struts的动作类中处理上传的文件。在<samples工程目录>"src"action目录中建立一个UploadAction.java文件,代码如下:

  package action;
  
  
import javax.servlet.http.*;
  
import org.apache.struts.action.*;
  
import org.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[8192];  
          
int count = 0;
          //  开始向上传路径中刚建立的文件写入数据,每次写8k字节
          while ((count = in.read(buffer)) > 0
          {
              fout.write(buffer, 
0, 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对象销毁。

    【第4步】配置struts-config.xml

    在这一步来配置一下在第2步和第3步分别建立的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" />

【第5步】设置用于保存上传文件的路径

    打开web.xml文件,找到一个叫action的Servlet(也就是用于处理Struts动作的Servlet),并在<servlet>中加入如下的子标签(假设保存上传文件的路径为D:"upload",路径的最后一个字符必须是“"”):

<init-param>
    
<param-name>uploadPath</param-name>
    
<param-value>D:\upload\</param-value>
</init-param>

    【第6步】限制上传文件的大小

    这一步是可选的,如果不限制上传文件的大小,就意味着可以上传任意大小的文件。而一般的应用程序,如电子相册,网络硬盘都会限制上传文件的最大尺寸。

    打开struts-config.xml文件,在<struts-config>中加入如下的子标签:

<controller maxFileSize="2M" />

    上面的<controller>标签将上传文件的最大尺寸设为2M,maxFileSize属性值的单位可以是M,也可以是K或G,如2K,5G等。

    启动Tomcat后,在IE中输入如下的URL来测试程序:

    http://localhost:8080/samples/uploadFile.jsp


相关文章推荐

Struts1.x系列教程(9):上传任意多个文件

从《Struts1.x系列教程(8):上传单个文件》中给出的例子可以看出,在Struts1.x中上传单个文件是非常简单的,但在实际应用中,上传文件的个数一般是不确定的,如在网络硬盘中,用户可以根据自己...

Struts1.x系列教程(15):使用DownloadAction类统计文件下载次数

除了标准的org.apache.struts.action.Action类外,在Struts中还提供了另外7个Action类来完成特殊的工作。本文及后面的文章中将介绍这些Action类的用法。   ...

Struts1.x系列教程(18):使用DispatchAction类调用多个Action方法

在使用Struts动作时,每一个Action都需要编写一个类,并且要在struts-config.xml进行配置。这对于一个拥有很多Action的Web程序来说,工作量是非常大的。为此,Struts提...

Struts1.x系列教程(16):使用LocaleAction类实现国际化的Web程序

我们曾经在《Struts1.x系列教程(13):国际化》一文中讲过如何通过编程的方式实现多语言的Web页面。在本文中,我们会介绍另外一种实现多语言Web页面的方法。这种方式与《Struts1.x系列教...

Struts1.x系列教程(4):标签库概述与安装

Struts的整个视图层(就是MVC模式中的View层)是由Struts的定制标签(或者称为定制动作)和客户端代码(Javascript、HTML等)实现的。这些Struts标签被写在JSP页面中,用...

Struts1.x系列教程(11):Validator验证框架高级应用

在《Struts1.x系列教程(10):Validator验证框架入门》一文中给出的例子中的name、age和email都是简单的属性,如果是嵌套的属性(也就是一个属性的数据类型是另外一个带有属性的类...

Struts1.x系列教程(17):使用IncludeAction和ForwardAction类包含和转入Web资源

一、使用IncludeAction类包含Web资源     虽然在JSP页面中可以使用标签包含另一个Web资源,但Struts框架提倡在包含Web资源时应先经过Struts控制器处理后,再由Stru...

Struts1.x系列教程(2):简单的数据验证

简单验证从本质上说就是在服务端来验证客户端提交的form中的数据。这种验证只是对form中的数据规则进行检查,如必须输入用户ID,价格不能小于0或是对email格式的验证。在这个验证过程中,并不需要访...

Struts1.x系列教程(20):使用EventDispatchAction类处理一个form多个submit

虽然LookupDispatchAction类可以很好地处理拥有多个提交按钮的Form,但是必须要和属性文件相关联,而且还得在getKeyMethodMap方法中进行key和Action方法的映射,使...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Struts1.x系列教程(8):上传单个文件
举报原因:
原因补充:

(最多只允许输入30个字)