• Struts 2 实现多文件上传


    Struts2中支持文件上传与下载的两个JAR文件是:

    commons-fileupload-1.2.2.jar

    commons-io-1.4.jar,

    这两个包要到apache网站上单独下载,下载网址是:

    http://commons.apache.org/fileupload/download_fileupload.cgi

    可下载:commons-fileupload-1.2.2-bin.zip,解压后,在它的lib中有commons-fileupload-1.2.2.jar

    http://commons.apache.org/io/download_io.cgi

    可下载:commons-io-1.4-bin.zip,解压后,有commons-io-1.4.jar

    要上传文件需要用到标签:<s:file>

    还要用到表单的“enctype”属性,设置为:enctype="multipart/form-data"  ,传送二进制数据文件。

    Demo:

    1、首页 index.jsp

     1 <%@ page language="java" contentType="text/html;charset=UTF-8"%>
     2 <%@ taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4     <head>
     5         <title>上传文件</title>
     6     </head>
     7     <body vLink="#006666" link="#003366" bgColor="#E0F0F8">
     8         <br>
     9         <b>上传文件</b>
    10         <s:form action="upload" enctype="multipart/form-data" method="post">
    11        <s:file name="upload" label="选择文件1">
    12             </s:file>
    13             <s:file name="upload" label="选择文件2">
    14             </s:file>
    15             <s:file name="upload" label="选择文件3">
    16             </s:file>
    17             <s:submit value="上传"></s:submit>
    18       </s:form>
    19   </body>
    20 </html>

    2struts.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
     4     "http://struts.apache.org/dtds/struts-2.0.dtd">
     5 
     6 <struts>
     7     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
     8     <constant name="struts.devMode" value="true" />
     9 
    10     <package name="up-load" extends="struts-default">
    11         <action name="upload" class="com.action.UpLoadAction">
    12             <!-- 部署本工程前,要在WebRoot下手工创建文件夹upload,上传保存到tomcat容器的webapps中的本工程的upload文件夹中 -->
    13             <param name="savePath">upload</param>  
    14             <!-- 上传失败时返回的视图页面 -->
    15             <result name="success">upsuccess.jsp</result>
    16             <result name="input">uperror.jsp</result>
    17             <!-- 声明action使用的拦截器 fileUpload -->
    18             <interceptor-ref name="fileUpload">
    19                  <!-- 限制上传的文件类型 -->
    20                 <param name="allowedTypes">image/gif,image/jpeg,image/x-png,image/bmp,text/plain,application/msword,application/vnd.ms-excel,application/x-zip-compressed,application/pdf,application/vnd.ms-powerpoint</param>
    21                 <!-- 限制上传文件大小为2048000字节(2M) -->
    22                 <param name="maximumSize">2048000</param>   
    23             </interceptor-ref>
    24             <!-- 配置Struts 2 的默认拦截器栈 -->
    25             <interceptor-ref name="defaultStack" />
    26         </action>
    27     </package>
    28 </struts>
    29 
    30 <!-- 对上传类型的说明: -->
    31 <!-- gif文件:image/gif -->
    32 <!-- jpg文件:image/jpeg -->
    33 <!-- png文件: image/x-png -->
    34 <!-- bmp文件:image/bmp -->
    35 <!-- txt文件:text/plain -->
    36 <!-- doc文件:application/msword -->
    37 <!-- xls文件:application/vnd.ms-excel -->
    38 <!-- zip、jar文件: application/x-zip-compressed -->
    39 <!-- pdf文件:application/pdf -->
    40 <!-- ppt文件:application/vnd.ms-powerpoint -->
    41 <!-- 除上述类型外的其它文件类型:application/octet-stream -->

    3Action代码

     1 package com.action;
     2 
     3 import java.io.*;
     4 import org.apache.struts2.ServletActionContext;
     5 import com.opensymphony.xwork2.ActionSupport;
     6 
     7 public class UpLoadAction extends ActionSupport {
     8     private File[] upload; // 封装上传文件
     9     private String[] uploadContentType; // 封装上传文件类型
    10     private String[] uploadFileName; // 封装上传文件名
    11     private String savePath; // 封装上传文件在服务器tomcat容器上的保存路径
    12 
    13     public File[] getUpload() {
    14         return upload;
    15     }
    16 
    17     public void setUpload(File[] upload) {
    18         this.upload = upload;
    19     }
    20 
    21     public String[] getUploadContentType() {
    22         return uploadContentType;
    23     }
    24 
    25     public void setUploadContentType(String[] uploadContentType) {
    26         this.uploadContentType = uploadContentType;
    27     }
    28 
    29     public String[] getUploadFileName() {
    30         return uploadFileName;
    31     }
    32 
    33     public void setUploadFileName(String[] uploadFileName) {
    34         this.uploadFileName = uploadFileName;
    35     }
    36 
    37     public String getSavePath() {
    38         // 以下ServletActionContext.getServletContext().getRealPath("")方法获取本工程在tomcat容器中的真实绝对路径,加上参数savepath,进一步得到下一级savepath所代表的文件夹的绝对路径
    39         String realpath = ServletActionContext.getServletContext().getRealPath(savePath); // 应为使用的是2.0的ServletAPI,所以不能调用request.getRealPath()
    40         return realpath;
    41     }
    42 
    43     public void setSavePath(String savePath) {
    44         this.savePath = savePath;
    45     }
    46 
    47     public String execute() throws Exception {
    48         File[] files = getUpload();
    49         for (int i = 0; i < files.length; i++) {
    50             FileInputStream fileInput = new FileInputStream(files[i]); // 创建文件输入流
    51             FileOutputStream fileOutput = new FileOutputStream(getSavePath() + "\\" + getUploadFileName()[i]); // 创建文件输出流
    52             byte[] b = new byte[2048]; // 缓冲数组大小2KB
    53             int len = 0;
    54             while ((len = fileInput.read(b)) > 0) // finout.read(b)实现从输入流读1KB数据到数组b中,返回读取的字节数len,遇到文件尾返回-1
    55             {
    56                 fileOutput.write(b, 0, len); // 将b中len字节数据写到输出流中
    57             }
    58             //fileInput.close(); // 关闭输入流
    59             //fileOutput.close(); // 关闭输出流
    60         }
    61         return "success";
    62     }
    63 }

    4upsuccess.jsp

     1 <%@ page language="java" contentType="text/html;charset=UTF-8" %>
     2 <%@ taglib prefix="s" uri="/struts-tags"%>  
     3 <html>
     4 <head>
     5 <title>上传文件成功</title>
     6 </head>
     7 <body vLink="#006666" link="#003366" bgColor="#E0F0F8">
     8 <img src="img/smile.gif">
     9 <h3>上传文件成功:</h3>
    10     <s:property value="uploadFileName"/><br><br>
    11 <a href="index.jsp">继续上传</a>
    12 <s:debug></s:debug>
    13 </body>
    14 </html>

    4uperror.jsp

     1 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
     2 <%@ taglib prefix="s" uri="/struts-tags"%>
     3 <html>
     4 <head>
     5 <title>查询失败</title>
     6 </head>
     7 <body vLink="#006666" link="#003366" bgColor="#E0F0F8">
     8 <img src="img/cry.gif">
     9 <h1>上传失败!</h1><br><br>
    10 <s:fielderror></s:fielderror>
    11 <br><br>
    12 <a href="index.jsp">返回上传页面</a>
    13 </body>
    14 </html>

     PS:

    若上传后文件名乱码,只需将页面的编码方式和struts.xml的设置的编码方式都用成gbk 即可

    Struts.xml的配置文件<constant name="struts.i18n.encoding" value="gbk"></constant>

     struts2 jpg文件上传失败 Content-Type not allowed:

    原因:ie会把 jpg、jpeg翻译成image/pjpeg,png翻译成image/x-png 。而火狐则很标准:jpg、jpeg翻译成image/jpeg,png翻译成image/png。

    解决方法:用火狐、谷歌等浏览器  or

         <param name="allowedTypes">      image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg      </param>

  • 相关阅读:
    每个部门都有自己的游戏规则
    ssh作为代理,反向登录没有固定公网ip的局域网内的某远程服务器
    x11vnc 作为远程桌面服务器时vnc客户端键盘无法长按连续输入字符
    vim 编译使用ycm启动问题 fixed
    ubuntu设置普通用户也能执行docker命令
    git常见使用
    切图的必要步骤
    css居中
    清除浮动
    Spring-AOP(2)
  • 原文地址:https://www.cnblogs.com/fanszone/p/2973191.html
Copyright © 2020-2023  润新知