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邮件扩充服务,它是一种多用途网际邮件扩充协议。简单说,它就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
三、Action(UploadAction)
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;
}
}
四、Struts.xml配置
<?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>