Struts2(十五)实现文件上传

一、导入包

  • 需要将commons-fileupload和commons-io包和struts包一起导入

实现步骤:

  1. 在Jsp页面实现客户端选择上传文件
  2. 配置Struts.xml,拦截器会自动接收上传的文件
  3. 在Action中实现代码上传文件存入服务器中
  4. 跳转至新页面展示上传的文件

二、单个文件上传

上传页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>单个文件上传</title>
</head>
<body>
<form action="doUpload.action" method="post" enctype="multipart/form-data">
<input type="file" name="upload"/>
<input type="submit" value="上传">
</form>
</body>
</html>

上传成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传成功</title>
</head>
<body>
<h1>上传的文件</h1>
<img alt="图片" src="<s:property value=‘savePath‘/>" />

</body>
</html>

UploadAction

package com.pb.web.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.io.IOUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {

    //上传文件全路径、类型、文件名
    private File upload;
    private String uploadContentType;
    private String uploadFileName;
    //新文件保存路径和名称
    private String savePah;

    public String doUpload() throws IOException{
        System.out.println(upload);
        System.out.println(uploadContentType);
        System.out.println(uploadFileName);
        String newFileName=System.currentTimeMillis()+uploadFileName.substring(uploadFileName.lastIndexOf("."));
        System.out.println("新的文件名:"+newFileName);
        //获取上传路径
        savePah=ServletActionContext.getServletContext().getRealPath("/upload/"+newFileName);
        System.out.println("上传保存的路径和名称:"+savePah);
        //使用文件输入、输出流写入文件
        FileInputStream fis=new FileInputStream(upload);
        FileOutputStream fos=new FileOutputStream(savePah);
        //设置缓冲区大小
        /*byte[] bytes=new byte[1024];
        //读取文件
        int length=fis.read(bytes);
        while(length>0){
            //写入文件
            fos.write(bytes);
            length=fis.read(bytes);
        }*/
        //复制文件
        IOUtils.copy(fis, fos);
        fos.flush();
        fos.close();
        fis.close();

        return SUCCESS;
    }

    public File getUpload() {
        return upload;
    }

    public void setUpload(File upload) {
        this.upload = upload;
    }

    public String getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }

    public String getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public String getSavePah() {
        return savePah;
    }

    public void setSavePah(String savePah) {
        this.savePah = savePah;
    }

}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
   <package name="default" namespace="/" extends="struts-default">
    <action name="doUpload" class="com.pb.web.action.UploadAction" method="doUpload">
    <result name="success">
    /singleUploadSuccess.jsp
    </result>
    <result name="error">
    /error.jsp
    </result>
    <result name="input">
    /singleUpload.jsp
    </result>
    </action>
    </package>
</struts>

三、限制文件大小

  • 在struts.xml中配置常量
<constant name="struts.multipart.maxSize" value="5000000"/>
5M大小

在action下配置拦截器

<interceptor-ref name="fileUpload">
    <param name="maximumSize">5000000</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

五、限制文件类型

<interceptor-ref name="fileUpload">
    <param name="allowedTypes">image/pjpeg,image/jpeg,image/gif,image/png</param>
    <param name="maximumSize">5000000</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.multipart.maxSize" value="1000000" />
    <constant name="struts.multipart.saveDir" value="/tmp"/>
    <package name="default" namespace="/" extends="struts-default">
    <action name="doupload" class="com.pb.web.action.UploadAction" method="upload">
    <interceptor-ref name="fileUpload">
            <param name="maximumSize">40000</param>
             <param name="allowedTypes">image/jpeg,image/pjpeg,image/gif,image/png</param>
        </interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
    <result name="success">
    /oneUploadSuccess.jsp
    </result>
    <result name="input">
    /error.jsp
    </result>
    </action>
    </package>
</struts>

六、多个文件上传

和单个文件上传一个只是接收参数变为数组

mulUpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>多个 文件上传</title>
<script type="text/javascript" src="js/jquery-1.11.2.min.js"></script>
<script type="text/javascript">
function addFile(){
    /*  获取父元素*/
    var parent=$("#add").parent();
    /*创建新的节点  */
    var file=$("<input type=‘file‘ name=‘upload‘ /><br/>");
    /* 添中节点 */
    parent.append(file);

}
</script>
</head>
<body>
<form action="doupload.action" method="post" enctype="multipart/form-data">
<input type="file" name="upload" />
<input type="button" value="继续添加"  onclick="addFile();" id="add"/>
<input type="submit" value="上传" /><br/>
</form>
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传失败</title>
</head>
<body>
上传失败<a href="mulUpload.jsp">返回</a>
<s:debug/>
</body>
</html>

mulUploadSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传成功</title>
</head>
<body>
<!--显示上传的图片  -->
<s:iterator value="savePath" var="i">
<img alt="图片" src="<s:property value=‘#i‘/>">
</s:iterator>
<s:debug/>
</body>
</html>

UploadAction.java

package com.pb.web.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport {
    // 文件上传路径、类型、名称
    private List<File> upload;
    private List<String> uploadFileName;
    private List<String> uploadContentType;
    // 新的文件名称
    private List<String> savePath=new ArrayList<String>();

    public String upload() throws IOException {
        for (int i = 0; i < upload.size(); i++) {
            //重命名 用长时间+原来的文件名
            String newFileName = System.currentTimeMillis()+""+uploadFileName.get(i);
            System.out.println("新的文件名:"+newFileName);
        //获取上传路径
            //将新的路径和名称添加入集合
            savePath.add(ServletActionContext.getServletContext().getRealPath("/upload/"+newFileName));
            System.out.println(savePath.get(i));
            //读取文件
            FileInputStream fis=new FileInputStream(upload.get(i));
            //写入文件
            FileOutputStream fos=new FileOutputStream(savePath.get(i));
            //将文件从输入流,复制到输出流中
            IOUtils.copy(fis, fos);
            //强制刷新输出流,清空缓冲区
            fos.flush();
            fos.close();
            fis.close();
        }

        return SUCCESS;
    }

    public List<File> getUpload() {
        return upload;
    }

    public void setUpload(List<File> upload) {
        this.upload = upload;
    }

    public List<String> getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(List<String> uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public List<String> getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(List<String> uploadContentType) {
        this.uploadContentType = uploadContentType;
    }

    public List<String> getSavePath() {
        return savePath;
    }

    public void setSavePath(List<String> savePath) {
        this.savePath = savePath;
    }

}

struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <!--设置文件大小拦截器  -->
    <constant name="struts.multipart.maxSize" value="10000000"></constant>

    <constant name="struts.multipart.saveDir" value="/tmp"/>
    <package name="default" namespace="/" extends="struts-default">
    <action name="doupload" class="com.pb.web.action.UploadAction" method="upload">

    <interceptor-ref name="fileUpload">
    <!--设置文件类型拦截器  -->
    <param name="allowedTypes">image/jpeg,image/pjpeg,image/png</param>
    <!--设置文件大小拦截器  -->
    <param name="maximumSize">5000000</param>
    </interceptor-ref>
    <!-- struts默认的拦截器 -->
    <interceptor-ref name="defaultStack" />

    <result name="success">
    /mulUploadSuccess.jsp
    </result>
    <result name="input">
    /error.jsp
    </result>
    </action>
    </package>
</struts>

更详细的请参考:struts下载包中的帮助文档:

file://stuts2/struts2-2.3.4.1-all/struts-2.3.4.1/docs/WW/file-upload.html

时间: 2024-10-06 16:05:11

Struts2(十五)实现文件上传的相关文章

Struts2学习笔记(十一)——文件上传下载

1.单文件上传 单文件上传步骤: 1)创建上传jsp页面 文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded,比如: 1 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/fo

Struts2 使用Jquery+ajax 文件上传

话不多说 直接上代码 前台js: 1 var formData = new FormData(); 2 formData.append("file1",$("#file1")[0].files[0]);//第一个file1代表后台文件属性名,第二个file1表示html中input的id 3 $.ajax({ 4 type:"post", 5 url:"ajax/uploadFile", 6 data:formData, 7

深入分析JavaWeb 47 -- Struts2拦截器与文件上传下载

一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事.过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面向切面)的编程思想,是可插拔的, 可以对访问某个 Action 方法之前或之后实施拦截. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在访问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用 Struts2执行原理

Struts2中实现多文件上传功能

上篇理了一下Struut 2实现文件上传功能的思路,下面接着来看一下多文件上传是如何实现的. 1. 多文件上传也是在单文件上传的基础上,稍微修改一下数据类型和实现方法,即可完成,思路都是大致相同的. 2. 仍然是使用上一篇的项目结构和代码,需要修改的只是UploadAction.java.upload.jsp这两个文件. 3. 修改后的UploadAction.java.upload.jsp这两个文件如下:  UploadAction.java package com.upload.action

Struts2的简单的文件上传

1文件上传的流程: 第一步:首先得用表单标签的<s:file>在客户端接收上传的文件例如: 1 <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> 2 <%@ taglib prefix="s" uri="/struts-tags" %> 3 <html> 4 <head&

深入分析JavaWeb Item47 -- Struts2拦截器与文件上传下载

一.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 过滤器VS拦截器功能是一回事. 过滤器是Servlet规范中的技术,能够对请求和响应进行过滤. 拦截器是Struts2框架中的技术.实现AOP(面向切面)的编程思想.是可插拔的, 能够对訪问某个 Action 方法之前或之后实施拦截. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 在訪问被拦截的方法时, Struts2拦截器链中的拦截器就会按其之前定义的顺序被依次调用 Struts2运行原

走进Struts2(六)— 文件上传和下载

一.文件上传 实现文件上传的方式有很多种,比如Apache的Common-FileUpload,但是实现起来非常的繁琐,而Struts2来实现文件上传则简单的多,默认也是基于Common-FileUpload的方式. 1.使用Struts2来实现文件上传,需要使用Struts2预定义的fileUpload拦截器,defaultStack拦截器栈引用了fileUpload拦截器:最后,struts-default包又将defaultStack拦截器声明为自己的默认拦截器引用.使用defaultSt

Struts2(二)文件上传和下载

struts2文件上传和下载 1.创建一个index.jsp界面 和success.jsp上传成功界面 index.jsp <%@ taglib prefix="s" uri="/struts-tags" %> <body> <s:form action="files/add" method="post" enctype="multipart/form-data"> &l

struts2中简单的文件上传

2016-08-31 一.       文件上传 利用commons-fileupload-1.2.1.jar实现简单的上传文件,首先在页面上填写表单,记得加上enctype="multipart/form-data",主要是确保上传文件的正确编码,设置表单的MIME编码,让form中的input值以2进制传过去,这样就能用于上传文件了. 2. 配置struts.xml,完成fileUpload与action实例映射, 这里以上传一个图片文件为例 <action name=&qu