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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Struts1.x系列教程(7):Logic标签库 Struts2教程7:上传任意多个文件     在Web程序中的上传文件的功能一般会使用标签在客户端显示输入要上传的文件名的用户接口。
: 宋体;">在Web 程序中的上传文件的功能一般会使用 标签在客户端显示输入要上传的文件名的用户接口。如果读者使用过JSP/Servlet 来处理客户端上传的文件就会知道,实现这个功能并不是很容易。而在Struts 中为我们提供了一种机制,可以非常方便地将客户端上传的文件保存在服务端。
   
Struts Html 标签库中提供了一个 标签,可以和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()方法

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

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

【第1步】建立上传文件的JSP页面
    在目录中建立一个uploadFile.jsp文件,代码如下:

  
  

  
< html >
    
< head >
      
< title > 上传单个文件(文件大小不能超过2M)  </ title >
    
</ head >
    
< body >

      
< html:form  enctype ="multipart/form-data"  action ="uploadFile" >  
        
< html:file  property ="myFile" />< p >   
        
< html:submit  value ="上传" />
      
</ html:form >
    
</ body >
  
</ html >

【第2步】建立ActionForm的子类

    在"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的动作类中处理上传的文件。在"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-bean  name ="uploadForm"  type ="actionform.UploadForm"   />    

   在中加入如下的子标签:

   < action  name ="uploadForm"  path ="/uploadFile"  scope ="request"  type ="action.UploadAction"   />

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

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

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


    这一步是可选的,如果不限制上传文件的大小,就意味着可以上传任意大小的文件。而一般的应用程序,如电子相册,网络硬盘都会限制上传文件的最大尺寸。
    打开struts-config.xml文件,在中加入如下的子标签:

   < controller  maxFileSize ="2M"   />

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

  
目录
相关文章
|
消息中间件 固态存储 数据挖掘
干货 | Elasticsearch Reindex性能提升10倍+实战
#1、reindex的速率极慢,是否有办法改善? 以下问题来自社区:https://elasticsearch.cn/question/3782 问题1:reindex和snapshot的速率极慢,是否有办法改善? reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶颈),reindex/snapshot的时候CPU还是IO使用率都很低,是不是集群受什么参数限制了reindex和snapshot的速率? reindex不管是跨集群还是同集群上都很慢,大约3~5M/s的索引速率,会是什么原因导致的?
干货 | Elasticsearch Reindex性能提升10倍+实战
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
262 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
654 221
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
321 32
Meta SAM3开源:让图像分割,听懂你的话
|
9天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1505 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
893 61