java中Struts2文件上传问题详解_java

首先是网页部分,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>

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, struts2
文件上传
struts2上传文件详解、java struts2文件上传、java struts文件上传、java struts2 上传pdf、java上传文件路径问题,以便于您获取更多的相关知识。

时间: 2024-08-03 15:47:00

java中Struts2文件上传问题详解_java的相关文章

Java中实现文件上传下载的三种解决方案(推荐)_java

java文件上传与文件下载是程序开发中比较常见的功能,下面通过本文给大家介绍Java中实现文件上传下载的三种解决方案,具体详情如下所示: 第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream(

发送-java中关于文件上传的问题。

问题描述 java中关于文件上传的问题. 如果写一个java程序,向新浪的ip地址发送一份文件,结果会如何??????? 解决方案 你的请求得不到任何响应,返回一个4xx的错误. 解决方案二: 你得到的响应跟你访问网页的响应一样,不过对方不会get到你的信息,除非新浪提供了开放的接口 解决方案三: 你可以自己给你自己发送一个文件你试试看,服务器上传文件都需要对应的端口去处理FTP服务,不是随意就可以的

JavaScript中文件上传API详解_javascript技巧

对于Web程序员来说,在网页上处理文件上传,总是一件很麻烦的事情.在过去,我们不能够通过拖拽上传图片,也没有复杂Ajax上传技术,很少处理多文件批量上传.我们也无法获取上传过程中的信息,除非上传完成后从服务器端获得.有时候,等你上传完毕后才发现上传的文件不合适! 如今,HTML5的革命,现代浏览器的诞生,JavaScript的升级,这些给我们提供了使用Javascript和input[type=file]元素获取上传文件过程信息的能力. 下面就来看看这些上传文件API是如何使用的! 访问要上传的

PHP文件上传实例详解!!!_php基础

首先来看下上传部分的表单代码:   复制代码 代码如下:      <form method="post" action="upload.php" enctype="multipart/form-data">        <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">         <tr>  

jquery组件WebUploader文件上传用法详解_jquery

WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件,下文来为各位演示一下关于jquery WebUploader文件上传组件的用法. 使用WebUploader还可以批量上传文件.支持缩略图等等众多参数选项可设置,以及多个事件方法可调用,你可以随心所欲的定制你要的上传组件. 接下来我以图片上传实例,给大家讲解如何使用WebUploader. HTML 我们首先将css和相关js文件加载. <link rel="s

uploadify java实现多文件上传和预览_java

本文实例为大家分享了java文件上传和预览实现代码,供大家参考,具体内容如下 1.下载uploadify插件 2.index.html <!DOCTYPE html> <html lang="en"> <head> <@head/> <script src="<@path/>/js/uploadify-v3.1/jquery.uploadify-3.1.js"></script> &

学习SpringMVC——国际化+上传+下载详解_java

一个软件,一个产品,都是一点点开发并完善起来的,功能越来越多,性能越来越强,用户体验越来越好--这每个指标的提高都需要切切实实的做点东西出来,好比,你的这个产品做大了,用的人多了,不仅仅再是上海人用,北京人用,还有印度人用,法国人用等等,可以说这个产品已经走上了国际化的大舞台.当印度的哥们输入url访问产品时,界面上弹出"欢迎您,三哥",估计哥们当场就蒙圈了.而这个时候,国际化就应运而生了. 要做国际化这道菜,真的没有想象中的那么复杂,反而很简单,不信你看-- 1. 注入Resourc

java中哈希表及其应用详解_java

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

JAVA中的final关键字用法实例详解_java

本文实例讲述了JAVA中的final关键字用法.分享给大家供大家参考,具体如下: 根据上下文环境,java的关键字final也存在着细微的区别,但通常指的是"这是无法改变的."不想改变的理由有两种:一种是效率,另一种是设计.由于两个原因相差很远,所以关键子final可能被误用. 接下来介绍一下使用到final的三中情况:数据,方法,类 final数据 许多编程语言都有某种方法,来向编译器告知一块数据是恒定不变的.有时数据的恒定不变是很有用的,例如: 1. 一个编译时恒定不变的常量 2.