首先将几个对象弄出来
第一个 上传页面
第二个 上传action
第三个 startut2配置文件

我的文字描述不是很好,但是终归是自己写出来的,后来我在网上看到一篇关于文件上传描述的非常清楚的文章,

链接地址是:http://www.blogjava.net/sxyx2008/archive/2009/10/22/299285.html ,大家可以看看,真的挺详细,比我的好多了

jsp页面

        <div ><!-- 发送模式头 -->
<form
action="${pageContext.request.contextPath}/newFileUpload.action"
encType="multipart/form-data" method="post" >
<span >
<input type="file" style="width: 230px" name="upload" />
<input type="submit" class="upload" value="上传" />
</span>
</form>
</div><!-- 发送模式尾 -->

struts.xml文件

    <!--     测试文件上传 -->
<action name="newFileUpload_*" class="com.kjkj.ema.view.action.NewFileUploadAction" method="{1}">
<!-- 动态设置action属性 -->
<param name="savePath">/upload</param>
<!-- 设置文件上传参数 -->
<interceptor-ref name="fileUpload">
<!-- 控制文件上传的扩展名 -->
<param name="allowedExtensions">.xls,.txt</param>
<!-- 控制文件上传类型 -->
<param name="allowedTypes">application/vnd.ms-excel,text/plain</param>
</interceptor-ref>
<!-- 文件上传里面必须提出引入默认拦截栈 -->
<interceptor-ref name="MyStack"/>
</action>

action

package com.kjkj.ema.view.action;

import java.io.File;

import org.apache.commons.io.FileUtils;

/**
* 文件上传
* */
public class NewFileUploadAction extends BaseAction { private static final long serialVersionUID = 1L;
//上传文件(在服务里目前这只是临时文件,后面需要删除的)
private File upload;
//上传文件名 (只需要提供set方式,但是需要注意的是set方式注入时,必须将上传的文件属性名+FileName[固定写法])
private String filename;
//上传文件类型 (upload后面的字符串为固定写法)
private String uploadContentType;
//上传文件保存路径 接受依赖注入属性 可以通过配置struts.xml文件中相对应的属性参数
private String savePath; @Override
public String execute() throws Exception {
System.out.println(upload.getName()); //upload_4ec7bab5_141a5569072__7fff_00000008.tmp
System.out.println(filename); //测试.txt
System.out.println(uploadContentType); //text/plain
System.out.println(savePath); ///upload /**
* 其实用Struts内容提供的判断文件类型我感觉是不严谨的,完全可以求改后缀名,所以我自己在网上找了个一些资料
* 目的是通过解析上传文件的内容二进制查看,这样的判断会更准确些,我将个资料写成一个帮助类,名字叫做FileTypeUtil
* 还有就是Common-io.jar包里面有个文件帮助类(FileUtils),对于文件可以操作简化的很多
* */
FileUtils.deleteQuietly(upload);
return null;
}
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String filename) {
this.filename = filename;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
}

判断文件真实类型

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/**
* 判断文件真实类型的帮助类
* */
public class FileTypeUtil {
public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>(); private FileTypeUtil() {
} static {
getAllFileType(); // 初始化文件类型信息
} /**
* Created on 2010-7-1
* <p>
* Discription:[getAllFileType,常见文件头信息]
* </p>
*
* @author:[shixing_11@sina.com]
*/
private static void getAllFileType() {
FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG (jpg)
FILE_TYPE_MAP.put("png", "89504E47"); // PNG (png)
FILE_TYPE_MAP.put("gif", "47494638"); // GIF (gif)
FILE_TYPE_MAP.put("tif", "49492A00"); // TIFF (tif)
FILE_TYPE_MAP.put("bmp", "424D"); // Windows Bitmap (bmp)
FILE_TYPE_MAP.put("dwg", "41433130"); // CAD (dwg)
FILE_TYPE_MAP.put("html", "68746D6C3E"); // HTML (html)
FILE_TYPE_MAP.put("rtf", "7B5C727466"); // Rich Text Format (rtf)
FILE_TYPE_MAP.put("xml", "3C3F786D6C");
FILE_TYPE_MAP.put("zip", "504B0304");
FILE_TYPE_MAP.put("rar", "52617221");
FILE_TYPE_MAP.put("psd", "38425053"); // Photoshop (psd)
FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); // Email
// [thorough
// only]
// (eml)
FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); // Outlook Express (dbx)
FILE_TYPE_MAP.put("pst", "2142444E"); // Outlook (pst)
FILE_TYPE_MAP.put("xls", "D0CF11E0"); // MS Word
FILE_TYPE_MAP.put("doc", "D0CF11E0"); // MS Excel 注意:word 和 excel的文件头一样
FILE_TYPE_MAP.put("mdb", "5374616E64617264204A"); // MS Access (mdb)
FILE_TYPE_MAP.put("wpd", "FF575043"); // WordPerfect (wpd)
FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
FILE_TYPE_MAP.put("ps", "252150532D41646F6265");
FILE_TYPE_MAP.put("pdf", "255044462D312E"); // Adobe Acrobat (pdf)
FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); // Quicken (qdf)
FILE_TYPE_MAP.put("pwl", "E3828596"); // Windows Password (pwl)
FILE_TYPE_MAP.put("wav", "57415645"); // Wave (wav)
FILE_TYPE_MAP.put("avi", "41564920");
FILE_TYPE_MAP.put("ram", "2E7261FD"); // Real Audio (ram)
FILE_TYPE_MAP.put("rm", "2E524D46"); // Real Media (rm)
FILE_TYPE_MAP.put("mpg", "000001BA"); //
FILE_TYPE_MAP.put("mov", "6D6F6F76"); // Quicktime (mov)
FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); // Windows Media (asf)
FILE_TYPE_MAP.put("mid", "4D546864"); // MIDI (mid)
} @SuppressWarnings("unused")
public static void main(String[] args) throws Exception {
File f = new File("c://aaa.xls");
if (f.exists()) {
String filetype2 = getFileByFile(f); }
} /**
* Created on 2010-7-1
* <p>
* Discription:[getImageFileType,获取图片文件实际类型,若不是图片则返回null]
* </p>
*
* @param File
* @return fileType
* @author:[shixing_11@sina.com]
*/
public final static String getImageFileType(File f) {
if (isImage(f)) {
try {
ImageInputStream iis = ImageIO.createImageInputStream(f);
Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
if (!iter.hasNext()) {
return null;
}
ImageReader reader = iter.next();
iis.close(); return reader.getFormatName();
} catch (IOException e) {
return null;
} catch (Exception e) {
return null;
}
}
return null;
} /**
* Created on 2010-7-1
* <p>
* Discription:[getFileByFile,获取文件类型,包括图片,若格式不是已配置的,则返回null]
* </p>
*
* @param file
* @return fileType
* @author:[shixing_11@sina.com]
*/
public final static String getFileByFile(File file) {
String filetype = null;
byte[] b = new byte[50];
try {
InputStream is = new FileInputStream(file);
is.read(b);
filetype = getFileTypeByStream(b);
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} return filetype;
} /**
* Created on 2010-7-1
* <p>
* Discription:[getFileTypeByStream]
* </p>
*
* @param b
* @return fileType
* @author:[shixing_11@sina.com]
*/
public final static String getFileTypeByStream(byte[] b) { String filetypeHex = String.valueOf(getFileHexString(b)); Iterator<java.util.Map.Entry<String, String>> entryiterator = FILE_TYPE_MAP
.entrySet().iterator(); while (entryiterator.hasNext()) { java.util.Map.Entry<String, String> entry = entryiterator.next(); String fileTypeHexValue = entry.getValue(); if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) { return entry.getKey();
} }
return null;
} /**
* Created on 2010-7-2
* <p>
* Discription:[isImage,判断文件是否为图片]
* </p>
*
* @param file
* @return true 是 | false 否
* @author:[shixing_11@sina.com]
*/
public static final boolean isImage(File file) {
boolean flag = false;
try {
BufferedImage bufreader = ImageIO.read(file);
int width = bufreader.getWidth();
int height = bufreader.getHeight();
if (width == 0 || height == 0) {
flag = false;
} else {
flag = true;
}
} catch (IOException e) {
flag = false;
} catch (Exception e) {
flag = false;
}
return flag;
} /**
* Created on 2010-7-1
* <p>
* Discription:[getFileHexString]
* </p>
*
* @param b
* @return fileTypeHex
* @author:[shixing_11@sina.com]
*/
public final static String getFileHexString(byte[] b) { StringBuilder stringBuilder = new StringBuilder();
if (b == null || b.length <= 0) {
return null;
}
for (int i = 0; i < b.length; i++) {
int v = b[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
} return stringBuilder.toString();
}
}

上传失败解决方案1

步骤分别是

1 在Struts2的配置文件中配置一个公共的result标签,该标签参考截图内容

2 新建一个页面,该页面显示文件上传失败信息,在页面中添加一个返回按钮

3 在返回按钮上面监听事件,根据请求头得referer信息,获取到这个信息,在JS里面,然后跳转

具体操作参考截图

4 需要注意的有两点

A 在js中获取referer 是document.referrer 跟referer是有区别的,多了个r单词

B 在网上看到一些获取referer的信息,其中多少都说到个浏览器兼容的问题,似乎在IE的环境下

js获取不到referer,但是我自己测试了下,是可以获取的到的,具体如何就不再去探究了,那段在浏览器不兼容的解决方案我一并截取下来,以防备用

<!-- 设置公共的跳转页面 -->
<global-results>
<result name="input" type="dispatcher">/WEB-INF/page/error/error_upload.jsp</result> </global-results>

上传失败页面

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>文件上传失败页面</title> <script type="text/javascript" src="js/jquery-1.9.1.js"></script>
</head>
<body >
<div>文件上传失败页面</div>
<div>
<span> <span> <input type="button" value="返回"
onclick="Enter1()" /> </span> </span>
</div>
<script type="text/javascript">
function Enter1(){
var refer=document.referrer;
window.location.href=refer;
}
</script>
</body>
</html>

浏览器兼容解决代码

Struts2文件上传方式与上传失败解决方式的更多相关文章

  1. excel打开csv格式的文件,数字末尾都变成零,解决方式

    excel打开csv格式的文件,数字末尾都变成零,解决方式

  2. 虚拟机使用scp传输文件提示“WARNING REMOTE HOST IDENTIFICATION HAS CHANGED”解决方式

    虚拟机使用scp传输文件提示"WARNING REMOTE HOST IDENTIFICATION HAS CHANGED"解决方式 简单的说就是虚拟机里保存的认证密钥不正确了,需 ...

  3. VS2012执行Cocos2d-xTest案例载入失败解决方式

    编译cocos2d-x,一直提示载入失败 通过搜索,解决方式例如以下: 第一步,通过命令提示行工具进入VS安装文件夹下的%VS2012home%Common7\IDE 第二部,运行devenv.exe ...

  4. IIs上MP4、及SVG格式加载失败解决方式

    部署项目是遇到网页播放mp4文件时候,MP4文件不能加载的问题.那是因为IIS上MIME类型中没有添加MP4的格式,添加一下即可. 解决方案: 1.在IIS上选中你的网站,然后点击右边的MIME类型, ...

  5. 关于使用struts2跳转后css和js失效的解决方式

    根据观察,主要是由于通过action跳转后的url会根据命名空间,自动跳转到命名空间子目录,使得当前引用的css和js查找不到,从而失效,根据这个原因,可使用四种办法解决: 1.使用struts2.x ...

  6. Ubuntu找不到stdio.h等头文件_安装c库_build-essential安装失败解决

    最近安装的Ubuntu1804系统,vim.gcc都是现安的,用gcc编译时出现找不到头文件情况: 于是百度. 原来linux类的操作系统上面开发程序,光有了gcc 是不行的,它还需要一个 build ...

  7. 外网訪问XAMPP失败 解决方式 XAMPP1.8.3

    xampp 訪问出现New XAMPP security concept New XAMPP security concept: Access to the requested directory i ...

  8. Android ListView异步载入图片乱序问题,原因分析及解决方式

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android全部系统自带的控件其中,ListView这个控件算是 ...

  9. ListView+CheckBox两种解决方式及原因分析

    近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量 ...

随机推荐

  1. mac ssh会话复制

    第一次登录服务器,需要输入账户.密码, 如果你需要重新开启另一个终端窗口,再次登录此服务器不需要输入账户.密码(类似免登).你只要让本地保存你的SSH会话即可. Mac 保持会话,需要在修改 ssh配 ...

  2. ECshop彻底去版权(同时适用于2.7.3)

    前台部分: 1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop前者”ECSHOP演示站”在后台商店设置 – 商店标题修改后者” Powered by ecshop”打开 ...

  3. Android ListView快速定位(二)

    方法二:android:textFilterEnabled="true" + Filter 这个属性在android.widget.AbsListView下,要求adapter必须 ...

  4. 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

    //字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void ...

  5. 设计模式-工厂方法(Demo)

    工厂方法 工厂方法跟简单工厂一样.都是创建型的设计模式.他攻克了简单工厂的违背开放封闭的缺点. 故事 主人--人家做饭好累的.女仆抱着我大腿说着.自从上次把她买进家.没做了几次饭就喊累--看着她那出处 ...

  6. android137 360 双击三击事件

    package com.itheima52.doubleclick; import android.app.Activity; import android.os.Bundle; import and ...

  7. android124 zhihuibeijing 新闻中心-组图

    package com.itheima.zhbj52.base.menudetail; import java.util.ArrayList; import android.app.Activity; ...

  8. PHP内核探索之变量 图解

    http://blog.csdn.net/ohmygirl/article/details/41542445 http://www.laruence.com/2008/09/19/520.html

  9. PAT 1006

    1006. Sign In and Sign Out (25) At the beginning of every day, the first person who signs in the com ...

  10. Programme skills

    1. Dynamic library 2. Template class. function template<typename T> classs Sample { ... templa ...