现在的位置: 首页 > 综合 > 正文

struts2文件上传及注意事项

2013年01月27日 ⁄ 综合 ⁄ 共 3755字 ⁄ 字号 评论关闭

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" />  

 

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

抱歉!评论已关闭.