zoukankan      html  css  js  c++  java
  • struts2文件上传及注意事项

    1、struts2的环境配置,我用的是struts2.3.4

    1)所需jar包如下:

    下载地址:http://labs.mop.com/apache-mirror//struts/binaries/struts-2.3.4-all.zip

    2)web.xml如下:

    View Code
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <welcome-file-list>
            <welcome-file>input.jsp</welcome-file>
        </welcome-file-list>
    
        <filter>
            <filter-name>struts2</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>struts2</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    </web-app>

    3)struts2配置文件struts.xml:

    View Code
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
        "http://struts.apache.org/dtds/struts-2.1.dtd">
    
    <struts>
        <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
        <constant name="struts.multipart.maxSize" value="20971520" />
        <constant name="struts.devMode" value="true" />
    
        <package name="upload" extends="struts-default" namespace="/">
            <action name="input" class="com.ljmin.action.UploadAction" method="input">
                <result name="input">/input.jsp</result>
            </action>
            <action name="upload" class="com.ljmin.action.UploadAction" method="upload">
                <result name="upload">/upload.jsp</result>
            </action>
        </package>
    
    </struts>
        

    2、jsp里加上文件标签

    <form action="upload/upload" method="post" enctype="multipart/form-data">
            <input type="file" name="myFile">
            <input type="submit" value="上传">
        </form>

    注意:enctype="multipart/form-data" 必须写,没有会报错。

    3、UploadAction

    View Code
    package com.ljmin.action;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Date;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    @SuppressWarnings("serial")
    public class UploadAction extends ActionSupport {
        private File myFile;
        private String fileName;
        private String saveName;
        private static final int BUFFER_SIZE = 8 * 1024;
    
        public String input() {
            return "input";
        }
    
        public String upload() {
            /* 截取后缀名 */
            int pos = fileName.lastIndexOf(".");
            String str = fileName.substring(pos);
            // 时间加后缀名保存
            saveName = new Date().getTime() + str;
            // 根据服务器的文件保存地址和原文件名创建目录文件全路径
            File imageFile = new File(ServletActionContext.getServletContext()
                    .getRealPath("upload")
                    + "/" + saveName);
            copy(myFile, imageFile);
    
            return "upload";
        }
    
        // 复制方法
        public static void copy(File src, File dst) {
            try {
                InputStream in = null;
                OutputStream out = null;
                try {
                    in = new BufferedInputStream(new FileInputStream(src),
                            BUFFER_SIZE);
                    out = new BufferedOutputStream(new FileOutputStream(dst),
                            BUFFER_SIZE);
                    byte[] buffer = new byte[BUFFER_SIZE];
                    while (in.read(buffer) > 0) {
                        out.write(buffer);
                    }
                } finally {
                    if (null != in) {
                        in.close();
                    }
                    if (null != out) {
                        out.close();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //得到文件名
        public void setMyFileFileName(String fileName) {
            this.fileName = fileName;
        }
    
        public File getMyFile() {
            return myFile;
        }
    
        public void setMyFile(File myFile) {
            this.myFile = myFile;
        }
    
        public String getFileName() {
            return fileName;
        }
    
        public void setFileName(String fileName) {
            this.fileName = fileName;
        }
    
        public String getSaveName() {
            return saveName;
        }
    
        public void setSaveName(String saveName) {
            this.saveName = saveName;
        }
    
    }

    注意:

    (1) ServletActionContext.getServletContext().getRealPath("upload") 表示服务器工程目录下的upload文件夹。跟工作路径是不一样的。

    所以项目重新部署的时候,这个文件夹会被替换掉,保存的文件也会被删除。测试阶段,重新部署项目应该先备份这些文件。

    (2) public void setMyFileFileName(String fileName) {
      this.fileName = fileName;
     }

    是把myFile路径里的文件名称赋值给fileName.

    (3) 上传文件名为中文的图片时,img将不能显示中文命名的图片,如:<img alt="" src="upload/中文.jpg">。

      如要显示,必须先转码。这里建议用“时间+后缀名”的方式,保存上传的图片。这样保证图片不重复,还避免了中文问题。

    (4) 上传文件大小默认是2M,超出会报错,可以在struts.xml更改默认大小:

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

    源码下载:https://files.cnblogs.com/ljmin/upload.zip

  • 相关阅读:
    python使用数据库的一些操作
    正则表达式整理
    tomcat启动成功但是访问不到官网
    控制反转 依赖注入 AOP 和 IOC
    abstract 和 interface区别
    input文本框 鼠标点击默认消失,不输入离开鼠标恢复默认值
    声明式管理事务:基于AspectJ的xml方式
    使用注解配置声明式事务
    spring事物 (mu课)
    oracle表之数据类型
  • 原文地址:https://www.cnblogs.com/ljmin/p/2581012.html
Copyright © 2011-2022 走看看