java中Struts2文件上传问题详解

首先是网页部分,upload_file.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>Upload File</title>
</head>
<body>
  <form action="UploadFile" method="post" enctype="multipart/form-data">
    <!--文件域-->
    <input type="file" name="source" /> <input type="submit" value="上传">
  </form>
</body>
</html>

上传文件的表单,metho必须设置成post,enctype必须设置成multipart/form-data。

从上面代码中可以看到这个表单提交给了UploadFile这个action来处理,那我们在struts.xml里面配置如下:

<action name="UploadFile" class="com.lidi.action.UploadAction">
  <result name="success">/uploadResult.jsp</result>
  <!--fileUpload拦截器,可用于限制上传文档的类型和文档大小 -->
  <interceptor-ref name="fileUpload">
  <!-- 限制文件大小20M,单位为字节 -->
    <param name="maximumSize">20971520</param>
  </interceptor-ref>
  <!--默认拦截器,必须声明在fileUpload拦截器之后 -->
  <interceptor-ref name="defaultStack" />
 </action>

fileUpload拦截器,用于设置上传路径,限制文件类型和大小。

关于限制文件大小,光有<param name="maximumSize">是不行的,还必须在<struts>标签下添加

<constant name="struts.multipart.maxSize" value="21000000"/>

这行代码表示整个项目所有要上传文件的地方允许上传的文件大小的最大值,也就是说这个项目里上传的任何单个文件大小不能超过21000000字节(约20M),如果项目中不添加这行代码,则默认允许上传的文件大小最大为2M,所以这也是突破struts2只能上传2M文件的限制的方法。

关于限制文件类型,如果需要限制为图片文件,则<interceptor>可以这样配置

<!-- 设置只允许上传图片文件 -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">image/bmp, image/x-png, image/gif, image/jpeg</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

<param name="allowedTypes">标签中的值都是文件的MIME类型,常用文件的MIME类型可以在%TOMCAT_HOME%\conf\web.xml中找到。

如果要限制为word文件,则可以<interceptor>可以这样配置

<!-- 设置只允许上传word文档 -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

然而我感觉这样来限制文件类型,不如用javascript在前端实现限制。

接下来写UploadAction,UploadAction必需的私有属性是source,这是和upload_file.jsp里面文件域的name属性是一致,就是说文件域的name属性值为source,则UploadAction中必需有私有属性source,另外,还有两个比较重要的私有属性:

private String sourceFileName; //待上传文件的文件名
private String sourceContentType; //待上传文件的文件类型
这两个变量名的格式就是前面的前缀source和upload_file.jsp中的文件域的name属性相同。

综合来说,就是,比如upload_file.jsp中文件域的name = “abc”,则Action中就需要这样定义

private File abc;
private String abcFileName;
private String abcContentType;

abc会自动获取要上传的文件对象,abcFileName自动获取文件名,abcContentType自动获取文件类型。

关于上传路径,是我要重点说一下的。

如果是上传到绝对路径,那还挺好搞的,但如果要上传到项目根目录下的upload文件夹呢,怎么获得这个upload文件夹的完整路径?

我尝试过使用

ServletActionContext.getServletContext().getRealPath("/upload");
但返回了null。也用过

ServletActionContext.getRequest().getRealPath("/upload");
还是返回了null。但在网上查下这个问题,很多人都推荐这么写,证明可能某些情况下这样写确实是可行的,但也有跟我一样返回null的人,他们同时推荐了一种新的方法,就是让UploadAction实现ServletContextAware接口。具体做法如下:

public class UploadAction extends ActionSupport implements ServletContextAware {

  /**
   * 省略其它代码...
   */
  private ServletContext context; 

  public ServletContext getContext() {
    return context;
  }

  public void setContext(ServletContext context) {
    this.context = context;
  }

  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
}

然后使用

String path = context.getRealPath("/upload");// 重要:斜杠不能少

获得upload文件夹的路径。然后执行上传:

/*将文件上传到upload文件夹下*/
File savefile = new File(path, sourceFileName);
FileUtils.copyFile(source, savefile);

我个人是比较推荐这种方法的,因为这种方法好像规避了当项目被打包转移到其它环境时也能保证获得正确的路径。

后面贴上UploadAction的完整代码UploadAction.java

package com.lidi.action;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport implements ServletContextAware {
  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private File source;// 待上传文件
  private String sourceFileName;// 待上传文件的文件名
  private String sourceContentType; // 待上传文件的文件类型
  private ServletContext context; // 重要
  /* 重要 */
  public ServletContext getContext() {
    return context;
  }
  public void setContext(ServletContext context) {
    this.context = context;
  }
  /* getters & setters */
  public File getSource() {
    return source;
  }
  public void setSource(File source) {
    this.source = source;
  }
  public String getSourceFileName() {
    return sourceFileName;
  }
  public void setSourceFileName(String sourceFileName) {
    this.sourceFileName = sourceFileName;
  }
  public String getSourceContentType() {
    return sourceContentType;
  }
  public void setSourceContentType(String sourceContentType) {
    this.sourceContentType = sourceContentType;
  }
  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
  public String execute() throws IOException {
    /*获取存放上传文件的路径:项目根目录upload文件夹*/
    String path;
    path = context.getRealPath("/upload");// 重要:斜杠不能少
    System.out.println(path);
    /*将文件上传到upload文件夹下*/
    File savefile = new File(path, sourceFileName);
    FileUtils.copyFile(source, savefile);
    System.out.println(savefile.getAbsolutePath());
    return SUCCESS;
  }
}

上传结果页uploadResult.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML>
<html>
 <head>
  <title>Upload Result</title>
 </head>
 <body>
 <p>文件名:<s:property value="sourceFileName" /></p>
 <p>文件类型:<s:property value="sourceContentType" /></p>
 <p>文件:<a href="upload/<s:property value="sourceFileName" />"><s:property value="sourceFileName" /></a></p>
 </body>
</html>

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • Struts2+jquery.form.js实现图片与文件上传的方法

    本文实例讲述了Struts2+jquery.form.js实现图片与文件上传的方法.分享给大家供大家参考,具体如下: jquery.form.js是jQuery的一个官方用语支持异步上传文件的插件.官方网站:http://plugins.jquery.com/form/ 结合Struts2三步轻松实现文件上传 一般是针对一个页面可能不止一个Form表单,所以在一个面提交表单会影响到另一个表单,为此,图片上传表单就可以使用无刷新提交方式上传,也就是异步上传,这时jquery.from.js就派上用

  • 关于Struts2文件上传与自定义拦截器

    一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

  • java中struts2实现简单的文件上传与下载

    一.Struts2文件上传  Struts2的文件上传实现非常简单,只需要简单几步就可完成: 注意: (1)文件上传的struts2标签为:<s:file name="" label="上传"/> (2)文件上传的前提是表单属性method="post" enctype="multipart/form-data"; (3)web应用中必须包含common-fileupload.jar和common-io.jar,因

  • struts2单个文件上传的两种实现方式

    通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构 2.新建Action 第一种方式 复制代码 代码如下: package com.ljq.action; import java.io.File; import org.apache.commons.io.FileUtils;import org.apache.struts2.ServletActionContext; import com.opensymph

  • JavaEE中struts2实现文件上传下载功能实例解析

    本文实例为大家分享了struts2实现文件上传下载的具体实现代码,供大家参考,具体内容如下 一.文件上传 struts提交的文件组件上传, 前台: 1).提交方式POST 2).表单类型 multipart/form-data 3).input type=file 后台: Apache提供的FileUpload组件 核心类: FileItemFactory FileItem的工厂 ServletFileUpload servlet 中的文件上传的核心类 FileItem 封装了上传的表单文件项的

  • Struts2实现单文件或多文件上传功能

    一.简述 Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 二.指定用户上传文件的大小,有两种方式 1)默认是在default.properties 文件的 struts.multipart.maxSize=20

  • SSH框架网上商城项目第13战之Struts2文件上传功能

    上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说.为此,这篇文章详细介绍一下Struts2实现文件上传的功能. 1. 封装文件信息 我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件.文件类型和文件名.针对我们要传的图片,我们新建一个Model如下: public class FileImage { private File file; private String contentType; private String fi

  • java中struts2实现文件上传下载功能实例解析

    本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签 复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">

  • JavaWeb中struts2实现文件上传下载功能实例解析

    在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.

  • struts2+jsp实现文件上传的方法

    本文实例讲述了struts2+jsp实现文件上传的方法.分享给大家供大家参考.具体如下: 1. java代码: package com.wang.test; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport; public cla

随机推荐