Struts 2和 Struts 1一样,文件上传都是封装了Apache的Common-fileupload方法,下面我一步步带大家实现上传。
建立java web项目,引入jar包,放在WEB-INF/lib下。下载地址:Struts2上传文件的jar包下载地址 。Web.xml配置文件,不要忘记配置Struts2过滤器
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <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>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>struts2文件上传例子</title> </head> <body> <form action="upload.action" method="post" enctype="multipart/form-data"> 标题:<input type="text" name="title"><br> 文件:<input type="file" name="myFile"><br> <input type="submit" value="提交上传"> </form> </body> </html>
注意:
页面整体的pageEncoding=“UTF-8”;
文件上传enctype="multipart/form-data"。enctype这个属性管理的是表单的MIME编码,共有三个值可选:
1、application/x-www-form-urlencoded
2、multipart/form-data
3、text/plain
其中application/x-www-form-urlencoded是默认值,作用是设置表单传输的编码。在html的form表单里默认就是这种传输编码类型。
而multipart/form-data是用来制定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或是是mp3等等。
text/plain是纯文本传输的意思,在发邮件的时候要设置这种编码类型,否则会出现接收时编码混乱的问题。
MIME,它的英文全称是"MultipurposeInternet Mail Extensions" 多功能Internet邮件扩充服务,它是一种多用途网际邮件扩充协议。简单说,它就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
package com.xx.struts2; 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 com.opensymphony.xwork2.Action; public class UploadAction { private String title; // 可以得到上传文件的名称 // 规则:输入域的名称+固定字符串FileName private String myFileFileName; // 取得文件数据 // 规则:File 输入域的名称 private File myFile; // 取得内容类型 // 规则:输入域的名称+固定字符串ContentType // private String myFileContentType; public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String execute() throws Exception { InputStream is = null; OutputStream os = null; try { is = new BufferedInputStream(new FileInputStream(myFile)); os = new BufferedOutputStream(new FileOutputStream("f:\\" + myFileFileName)); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) > 0) { os.write(buffer, 0, len); } } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } return Action.SUCCESS; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 当struts.xml配置文件发生修改,会立刻加载,在生产环境下最好不要配置 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 会提供更加友好的提示信息 --> <constant name="struts.devMode" value="true" /> <!-- 需要继承struts-default包,这样就拥有的最基本的功能 --> <package name="upload-package" extends="struts-default"> <action name="upload" class="com.xx.struts2.UploadAction"> <result name="success">/upload_success.jsp</result> </action> </package> </struts>