文档章节

新手第一帖

wangrikui
 wangrikui
发布于 2013/12/07 17:40
字数 1617
阅读 56
收藏 2
Struts1文件上传

在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-..." 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/...

以上为转载。。。。

ps:

文件可以上传成功,但在页面显示的时候出来问题,经过我反复的调试,终于找到了问题根源所在,现总结如下:

1、对于上传的路径,一定要是在服务器的项目工程目录下,比如工程是部署在tomcat下的,则上传的文件要放在wabapps目录下;

2、在页面显示时,不能使用物理路径,一定要是url地址,就加工程名的绝对路径,或是相对路径;

3、另外,还要注意中文问题,对于中文的文件要进行转码,使上传的和显示的都是同一个编码;也可以将文件名重命名,我个人比较喜欢用UUID加日期的格式。

© 著作权归作者所有

wangrikui
粉丝 10
博文 31
码字总数 20614
作品 0
南京
后端工程师
私信 提问
开源中国wp客户端上主页的动态磁铁怎么实现啊?求大神赐教

开源中国wp客户端上主页的动态磁铁怎么实现啊?求大神赐教。 我是wp开发新手,在百度上找到许多资源,都只是谈到将应用创建动态磁帖到首页,琢磨了好久,却还是不懂oschina for wp上主页动态...

DexiveFlamesky
2013/03/29
147
1
正则求优化~~去除没用的字符中要中文

$str = "[i=s] 本帖最后由 glayones 于 2012-8-29 10:58 编辑 [/i] [color=#0000ff][b]{:2_29:}新手引导:[/b][/color] [url=h43ttp://bbs.popgamer.com/forum.php?mod=viewthread&tid=8&ex......

不会武功的猪
2013/03/27
116
1
[教程]在 win7 / win8 下安装苹果系统 (懒人版)

前言 这篇安装教程的素材在国庆就准备好了,但那时学习任务比较重,没有时间发帖,一直拖到现在。趁这个周末有空,赶紧写完它,希望能帮助一些景友。 论坛已经有不少安装教程,如果对这篇安装...

TaeTiSeo
2014/06/16
22.3K
1
大一专业计算机学生该关注什么

如题……想学好计算机光看书还该关注网上哪些东西或者网站。像开源这种网站我实现是看不懂那些帖说的是什么。还有什么对自学有帮助的网站呢?求大神指导新手……

小沙弥
2014/07/04
817
23
适合新手入门的量化投资的学习资源

本页面收集整理了适合新手入门的量化投资的学习资源 什么是量化投资? 学习量化投资如何入门:http://www.zhihu.com/question/22211032 知乎上的宽客话题:http://www.zhihu.com/topic/1955...

dana-quant
2015/09/15
18
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Tomcat中的连接器(Connector)

上期回顾 上一篇文章《Tomcat在SpringBoot中是如何启动的》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Conne...

木木匠
39分钟前
3
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
1K
20
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
28
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部