文件上传:
Struts文件上传心得:
1.使用 org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;这个拦截器,在action被调用之前,会首先走到fileUpload拦截器(对应的是FileUploadInterceptor类),在这个拦截器中,会先看一下request是不是 MultiPartRequestWrapper,如果不是,就说明不是上传文件用的request,fildUpload拦截器会直接将控制权交给下一个拦截器;如果是,就会把request对象强转为MultiPartRequestWrapper对象,然后调用hasErrors方法,看看有没有上传时候产生的错误,有的话,就直接加到了Action的错误(Action级别的)中了。另外,在fileUpload拦截器中会将MultiPartRequestWrapper对象中放置的文件全取出来,把文件、文件名、文件类型取出来,放到request的parameters中,这样到了params拦截器时,就可以轻松的将这些内容注入到Action中了,这也就是为什么fileUpload拦截器需要放在params拦截器前面的理由。在文件都放到request的parameters对象里之后,fileUpload拦截器会继续调用其他拦截器直到Action等执行完毕,他还要做一个扫尾的工作:把临时文件夹中的文件删除(这些文件是由commons-fileupload组件上传的,供你在自己的Action中将文件copy到指定的目录下,当action执行完了后,这些临时文件当然就没用了)。
2.Struts 2的文件上传,底层还是由apache的commons-fileupload 实现的。
3.配置文件:
<!-- 上传的文件存放目录 -->
<constant name="struts.multipart.saveDir" value="tmp"/>
<!-- 参数struts.multipart.maxSize 为文件尺寸 默认是2M,如果不进行配置上传超出2M,会抛出错误 -->
<constant name="struts.multipart.maxSize" value="2000000" />
4.页面的标签:标签的名字一是“upload”
<input title="浏览..." value="" id="file_id" name="upload" class="e_inputfile" onfocus="this.className='e_inputFocusfile'" onblur="this.className='e_inputfile'" type="file" />
5.1 页面代码:
upload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@ taglib prefix="c" uri="/WEB-INF/tags/c.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>广告系统</title>
<link href="<%=path %>/css/platform.css" rel="stylesheet" type="text/css" />
<!-- JQUERY 主要JS库 -->
<script type="text/javascript" src="<%=path %>/js/lib/jquery.js"></script>
<!-- JSTREE 主要JS库-->
<script type="text/javascript" src="<%=path %>/js/lib/jquery.cookie.js"></script>
<script type="text/javascript" src="<%=path %>/js/lib/jquery.hotkeys.js"></script>
<script type="text/javascript" src="<%=path %>/js/jquery.jstree.js"></script>
<script type="text/javascript" src="<%=path %>/js/util.js"></script>
<script type="text/javascript" src="<%=path %>/jquery/jquery.form.js"></script>
<script type="text/javascript">
function changeBody(index){
switch(index){
case 1:{
document.getElementById('wm-info').style.display = "";
break;
}
}
}
function close(){
ocument.getElementById("wm-info").style.display ="none";
}
</script>
<script type="text/javascript">
var sel_node_id;
//公共方法--获得dom对象
function getObj(id){
var obj = document.getElementById(id);
return obj;
}
//公共方法-选择下拉框的值
function selectOptionVal(id){
var positionVal="-1";
var selectPobj = getObj(id);
var options = selectPobj.options;
for(var i = 0; i < options.length; i++){
var optionResult = options[i].selected ;
if(optionResult){
positionVal = options[i].value;
}
}
return positionVal;
}
//检查input框,路径不能为空
function checkFileName(){
var uploadFilePath = getObj("file_id").value;
//alert("上传文件的路径"+uploadFilePath);
if(uploadFilePath == "" || uploadFilePath == null || uploadFilePath == undefined){
alert("上传的文件不能为空!");
return false;
}
return true;
}
//检查通过开始提交,后开始验证到上传文件
function submitForm(nodeId,materialTypeVal,postionTypeVal,positionVal,iscover){
var form = $("form[name=form1]"); //其中的form1是我form的名称
var options = {
url:'<%=application.getContextPath() %>/material/checkMaterial.do',
type:'post',
dataType:'json',
data: {nodeTypeId:nodeId,materialType:materialTypeVal,postionType:postionTypeVal, positionId:positionVal,cover:iscover},
success:function(data){
var flag = data.result;
if(flag){
alert("上传成功");
}else{
alert("上传失败,原因:"+data.msg);
}
}
};
form.ajaxSubmit(options);
}
//提交前先审核
function checkFile(){
var nodeId = getObj("treeNodeId").value;
if(nodeId == null || nodeId == undefined){
alert("请选择素材分类树的节点!");
return;
}
//确定那个素材分类
var materialType = selectOptionVal("sel_material_type");
if(materialType == "-1"){
alert("请选择-素材分类!");
return;
}
//确定那个素材类型
var postionType = selectOptionVal("sel_postion_type");
if(postionType == "-1"){
alert("请选择-素材类型!");
return;
}
//确定那个广告位的素材
var positionVal = selectOptionVal("sel_postion_id");
if(positionVal == "-1"){
alert("请选择-广告位!");
return;
}
if(!checkFileName()){
return;
}
var form = $("form[name=form1]"); //其中的form1是我form的名称
var options = {
url:'<%=application.getContextPath() %>/material/checkFileName.do',
type:'post',
dataType:'json',
data: {nodeTypeId:nodeId},
success:function(data){
var flag = data.result;
var isHasSame = data.isHasSame;
if(flag){
if(isHasSame){
if(confirm("有同名的文件,确定要覆盖吗?")){
submitForm(nodeId,materialType,postionType,positionVal,1);
}else{
alert("请您修改上传文件的名字!");
}
}else{
submitForm(nodeId,materialType,postionType,positionVal,0);
}
}else{
alert("上传失败,原因:"+data.msg);
}
},
async:false
};
form.ajaxSubmit(options);
}
</script>
<script type="text/javascript">
//加载树
function init(){
$.ajax({
type:"post",
//url: getContextPath() + '/material/listMaterialType.do',
url: "<%=application.getContextPath() %>/material/listMaterialType.do",
dataType :"String",
success:function(json){
var str = json.replace(/\"id"/g, 'attr:{"id"');
var str2 = str.replace(/\,"data"/g, '},data');
var jsondata = eval(str2);
jtree(jsondata);
},
error:function(){
alert("服务器异常,请稍后重试!");
},
async:false
});
}
function jtree(o){
var ctxPath = "<%=path%>";
$("#tree").jstree(
//json加载数据节点
{
//json数据区域
"json_data" :{data:o}
,
//要使用到的插件
"plugins" : [ "themes", "json_data", "ui", "crrm", "cookies", "types"]
,
"types" : {
"max_depth" : -2,
"max_children" : -2,
"valid_children" : [ "drive" ],
"types" : {
"default" : {
"valid_children" :"none",
"icon" : {
"image" : ctxPath+"/images/folder.png"
}
}
}
}
})
//选择事件
.bind("select_node.jstree", function(e, data) {
var id = parseInt(data.rslt.obj.attr("id"));
document.getElementById("treeNodeId").value =id;
})
}
</script>
</head>
<body onload="init()">
<!--
<form action="" id="form1" name="form1" enctype="multipart/form-data" >
-->
<form action="" id="form1" name="form1" >
<input type="hidden" value="" id="treeNodeId" />
<table cellpadding="0" cellspacing="1" class="servicesT">
<tr>
<th class="formTitle" colspan="99">
<span>上传素材</span>
</th>
</tr>
<tr>
<td class="td_label">选择素材分类:</td>
<td class="td_input">
<select id="sel_material_type" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${mKindList}" var="materialBean">
<option value="${materialBean.id }">${materialBean.name }</option>
</c:forEach>
<!--
<option value="0" >文字</option>
<option value="1" >图片</option>
<option value="2" >视频</option>
<option value="3" >压缩包</option>
-->
</select>
</td>
<td class="td_label">选择素材类型:</td>
<td class="td_input">
<select id="sel_postion_type" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${mTypeList}" var="materialBean">
<option value="${materialBean.id }">${materialBean.name }</option>
</c:forEach>
<!--
<option value="1" >标清</option>
<option value="2" >高清</option>
-->
</select>
</td>
<!-- <td class="td_label">选择广告位:</td>
<td class="td_input">
<select id="sel_postion_id" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${pNameList}" var="positionBean">
<option value="${positionBean.id }">${positionBean.positionNameCn }</option>
</c:forEach>
<option id="ad_id" value="1">换台广告</option>
<option id="ad_id" value="2">音量广告</option>
<option id="ad_id" value="3">频道列表广告</option>
<option id="ad_id" value="4">循环播放广告</option>
<option id="ad_id" value="5">菜单广告</option>
</select>
</td> -->
</tr>
<tr>
<td class="td_label">选择广告位:</td>
<td class="td_input"><select id="sel_postion_id" onchange="selectOptionVal(this.id)" class="e_select" onfocus="this.className='e_selectFocus'" onblur="this.className='e_select'" >
<option id="ad_id" value="-1">请选择...</option>
<c:forEach items="${pNameList}" var="positionBean">
<option value="${positionBean.id }">${positionBean.positionNameCn }</option>
</c:forEach>
<!--
<option id="ad_id" value="1">换台广告</option>
<option id="ad_id" value="2">音量广告</option>
<option id="ad_id" value="3">频道列表广告</option>
<option id="ad_id" value="4">循环播放广告</option>
<option id="ad_id" value="5">菜单广告</option>
-->
</select> </td>
<td class="td_label">选择文件:</td>
<td class="td_input">
<input title="浏览..." value="" id="file_id" name="upload" class="e_inputfile" onfocus="this.className='e_inputFocusfile'" onblur="this.className='e_inputfile'" type="file" /> </td>
</tr>
<tr>
<td class="td_labela">选择类型:<br /><br />(大类别包括多个小类别)</td>
<td colspan="5" class="td_inputaa" valign="top">
<div id="tree" class="tree" ></div>
</td>
</tr>
<tr>
<td class="formBottom" colspan="99">
<input name="Submit"
type="button"
title="上传"
class="b_next"
value=""
onclick="checkFile()"
/>
</td>
</tr>
</table>
</form>
</body>
</html>
5.2 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>
<!-- global -->
<include file="struts-default.xml" />
<include file="struts-plugin.xml" />
<include file="struts/struts-playItem.xml" />
<include file="struts/struts-twowayAdvert.xml" />
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 配置国际化相关信息 -->
<constant name="struts.custom.i18n.resources" value="struts.messageResource" />
<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 开发模式下使用,这样可以打印出更详细的错误信息
<constant name="struts.devMode" value="true" /> -->
<constant name="struts.devMode" value="false" />
<!-- 上传的文件存放目录 -->
<constant name="struts.multipart.saveDir" value="tmp"/>
<!-- 参数struts.multipart.maxSize 为文件尺寸 默认是2M,如果不进行配置上传超出2M,会抛出错误 -->
<constant name="struts.multipart.maxSize" value="2000000" />
<!-- 把action对象交给spring创建 -->
<constant name="struts.objectFactory" value="spring" />
<!-- 如果不是用action作为扩展名,则需要在这个地方配置扩展名,否则映射不上 -->
<constant name="struts.action.extension" value="do" />
<package name="material" namespace="/material" extends="struts-default">
<action name="listMaterial" class="materialAction" method="getTypes" />
<action name="listMaterialType" class="materialAction" method="listMaterialType" />
<action name="addMaterialType" class="materialAction" method="addMaterialType" />
<action name="delMaterial" class="materialAction" method="deleteMaterialType" />
<action name="updateMaterial" class="materialAction" method="updateMaterialType" />
<action name="getMaterialTypePath" class="materialAction" method="getMaterialTypePath" />
<action name="findMaterial" class="materialAction" method="findMaterial" >
<result name="success" >/page/material/materialFind.jsp</result>
</action>
<action name="checkFileName" class="materialAction" method="checkFileName" />
<action name="checkMaterial" class="materialAction" method="uploadMaterial" />
<action name="toUploaldFile" class="materialAction" method="showUploaldMaterial" >
<result name="success">/page/material/add.jsp</result>
</action>
</package>
</struts>
5.3 action的代码:
public class MaterialAction extends BaseActionSupport<Object> implements ServletRequestAware{
String tempPath = MATERIAL_TEMP_DIR + _SEPARATOR + materialName;
File dstFile = new File(tempPath);
/** 复制到临时文件夹内 */
int fileSize;
try {
fileSize = FileOperate.copyFile2FileSize(this.upload, dstFile);
}
BaseActionSupport
package com.dvnchina.itv.advert.action;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import com.dvnchina.itv.advert.utils.GenericsUtil;
import com.opensymphony.xwork2.ActionSupport;
public class BaseActionSupport<T> extends ActionSupport{
private static final long serialVersionUID = 1510137542622373146L;
protected final Log log = LogFactory.getLog(getClass());
protected final static String SPE = File.separator;
/**
* id主键
*/
protected Long id;
/**
* 多个id字符串,以"逗号"分割
*/
protected String ids;
/**
* 工程的contextPath
*/
protected String contextPath;
/**
* extJs的页号
*/
protected int start;
/**
* extJs的分页记录
*/
protected int limit;
/**
* 页号
*/
protected int pageNo;
/**
* 每页记录数
*/
protected int pageSize;
/**
* 表格查询参数
*/
protected String query;
/**
* json格式数据
*/
protected String dataJson;
/**
* 上传的文件
*/
protected File upload;
/**
* 上传文件类型属性
*/
protected String uploadContentType;
/**
* 上传的文件名
*/
protected String uploadFileName;
@SuppressWarnings("unchecked")
protected Class clazz;
@SuppressWarnings("unchecked")
protected Class getClazz() {
return clazz;
}
@SuppressWarnings("unchecked")
public BaseActionSupport() {
Class genericClass = GenericsUtil.getGenericClass(getClass());
clazz = genericClass;
}
/**
* render Text
*/
public void renderText(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/plain");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e);
}
}
/**
* render HTML
*/
public void renderHtml(String content) {
HttpServletResponse response = null;
PrintWriter out = null;
try {
response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
out = response.getWriter();
out.print(content);
out.flush();
} catch (IOException e) {
log.error("输出提示信息时出现异常",e);
} finally{
if (out!=null) {
out.close();
}
}
}
/**
* render XML
*/
public void renderXML(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e);
}
}
/**
* render json
*/
public void renderJson(String content) {
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
public PrintWriter getWriter(String encoding) throws IOException{
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html");
response.setCharacterEncoding(encoding);
PrintWriter out = response.getWriter();
return out;
}
/**
* 取得request
* @return
*/
public HttpServletRequest getRequest(){
HttpServletRequest request = ServletActionContext.getRequest();
return request;
}
/**
* 取得MultipartRequest
* 上传文件使用
* @return
*/
public MultiPartRequestWrapper getMutipartRequest(){
MultiPartRequestWrapper mulRequest = (MultiPartRequestWrapper) ServletActionContext.getRequest();
return mulRequest;
}
/**
* get userName from session
*/
public static String getUserNameFromSesssion() {
String name = (String) ServletActionContext.getRequest().getSession().getAttribute("username");
return name;
}
/**
* get conf from configuration.properties
*/
public static String getPropertiesValue(String key) {
// PropertiesUtil.init("configuration.properties");
// String value = PropertiesUtil.getProperty(key,"");
// return value;
return null;
}
/**
* 页面跳转
*/
public String forWard() throws Exception {
return SUCCESS;
}
/**
* get project realPath
*/
public String getRealPath() {
HttpServletRequest request = (HttpServletRequest) ServletActionContext.getRequest();
String path = request.getSession().getServletContext().getRealPath("/");
return path;
}
/**
* 获取Response
* @return
*/
public HttpServletResponse getResponse(){
HttpServletResponse response = ServletActionContext.getResponse();
return response;
}
public String getContextPath() {
return contextPath;
}
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
public void setQuery(String query) {
this.query = query;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
public String getDataJson() {
return dataJson;
}
public void setDataJson(String dataJson) {
this.dataJson = dataJson;
}
public String getIds() {
return ids;
}
public void setIds(String ids) {
this.ids = ids;
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
}