广告项目:(1 )文件上传
文件上传:
?
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" 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" colspan="99">
????<span>上传素材</span>??
???</th>
??</tr>
??<tr>
???<td 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 >
?????<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 onchange="selectOptionVal(this.id)"?? 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 onchange="selectOptionVal(this.id)"?? 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 value=""? id="file_id" name="upload" onfocus="this.className='e_inputFocusfile'" onblur="this.className='e_inputfile'" type="file" />??</td>
???? </tr>
??<tr>
???<td valign="top">
???<div id="tree" colspan="99">
????<input name="Submit"
????type="button"
????title="上传"
????
????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" method="getTypes" />
??<action name="listMaterialType" method="listMaterialType" />
??<action name="addMaterialType" method="addMaterialType" />
??<action name="delMaterial" method="deleteMaterialType" />
??<action name="updateMaterial" method="updateMaterialType" />
??<action name="getMaterialTypePath" method="getMaterialTypePath" />
??<action name="findMaterial" method="findMaterial" >
???<result name="success" >/page/material/materialFind.jsp</result>
??</action>?
??
??<action name="checkFileName" method="checkFileName" />
??<action name="checkMaterial" method="uploadMaterial" />
??<action name="toUploaldFile" 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;
?}
}
?