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

简介:
Struts2教程7:上传任意多个文件

     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





 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215207,如需转载请自行联系原作者


相关文章
|
1月前
|
Java
Struts文件上传与下载详解 _上传多个文件
Struts文件上传与下载详解 _上传多个文件
19 0
|
1月前
|
Java
Struts文件上传与下载详解_上传单个文件
Struts文件上传与下载详解_上传单个文件
9 0
|
1月前
|
Java
Struts文件上传与下载详解_文件的下载
Struts文件上传与下载详解_文件的下载
7 0
SpringMVC学习(十):文件的上传和下载
在SpringMVC中使用ResponseEntity实现下载文件的功能
|
前端开发 数据库
struts2实现的文件上传下载案例(二)、FileUpLoad文件的下载
struts2实现的文件上传下载案例(二)、FileUpLoad文件的下载
78 0
|
Java 开发者
Struts2的文件下载 | 学习笔记
快速学习 Struts2的文件下载,介绍了 Struts2的文件下载系统机制, 以及在实际应用过程中如何使用。
73 0
|
XML Java 数据格式