一、问题场景:

前阵开发一个报表功能,功能简单描述为上传一个excel文件,读取里面已有的内容,进行一些查询操作,填充一些数据进去返回给用户下载。系统里已有类似功能,笔者使用之前的上传模块,发现文件不能上传成功,一闪即过,测试以前别人做的功能也是一样,后使用别人机器访问我机器上应用,发现有些人可以,有些人不行,跟个人机器有关。

二、问题分析:

1、首先对多台机器访问同一台应用进行测试,测试结果不一样,每台机器结果是稳定不变的,所以排除服务器配置问题(开始认为)。

2、对多个浏览器进行测试,排除浏览器兼容性问题。检查浏览器设置,未发现特别配置选项,机器或浏览器个性化配置存在可能性问题。

3、检查后台发现如下日志:

Feb 24, 2014 11:11:30 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info

INFO: Unable to find ‘struts.multipart.saveDir’ property setting. Defaulting to javax.servlet.context.tempdir

Feb 24, 2014 11:11:31 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn

WARNING: Content-Type not allowed: excelFile “test.xls” “upload__13a393f7_14461e04261__8000_00000000.tmp” application/kset

最开始未注意该段日志, 因为开始武断地否认是服务器配置问题,日志级别又不是error,所以未引起重视,后来才渐渐发现问题。info那句是表明没有设置struts上传文件的临时目录,从而系统使用了默认的临时目录。关键warning一句,application/kset不允许上传的文件类型,kset,当时笔者没看懂,以为是struts自己处理的什么东西,因为笔者上传文件类型就是xls类型的。后来发现真正的文件类型是application/kset,这里文件类型是指我们常用的MIME类型,而服务器报application/kset是不允许上传的文件类型,百度发现为WPS的MIME文件类型。

三、问题解决:

1、配置struts上传的拦截器,在allowedTypes中加入application/kset,重启应用,问题解决。

2、继续回顾该问题,网上有文章说是因为安装wps引发的,但测试时,没有问题的几台机器也是安装了wps,最后找到一个可能的原因,出现问题的都是装的wps2013,很新的版本,所以猜测应该是新版的wps的MIME类型为application/kset,而旧版的应该是同excel一样,为application/excel、application/vnd.ms-excel。