分享
 
 
 

JSP SmartUpload上传文件乱码解决纪实+UploadBean上传解决方案

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者:fbysss

声明:本文为fbysss原创,如需引用,请注明作者及引用地址

关键字:smartupload,uploadbean,linux,中文乱码

一、SmartUpload上传文件乱码解决纪实

恶心指数:五星

完成程度:80%(文件名问题未解决)

问题描述:在windows下开发的web应用,用到了smartupload上传文件,需求很简单,就是一个表单文件formdata.jsp,一个获取表单并上传的文件getdata.jsp,调试的时候,windows和linux系统下均正常,当系统安装到另一台服务器的时候,却出现了获取表单参数值为乱码(全是问号???)的问题。

我脑子里面第一感觉是:两台机器,据同事说是同一张光盘安装的Linux,但我想,根据逻辑推断,肯定是这liux装得不一样,或者是相关的服务不一样。否则怎么可能呢?然而,上头任务交给我来解决了,而且系统马上要正式使用,如果我要求重新安装Linux,几乎是不可能的。那好,我不入地狱,谁入地狱?我就闯它一把。

其实在这个时候,我还认为问题不大的。因为java开发的东西,乱码问题是家常便饭,而解决办法也就是那几种。不就一个转码吗?当时头儿问我问题大不大,我说,应该没啥大问题。

我开始进行getByte()转码,用ISO-8859-1 与gb312/GBK”互相转换,未果,又加入UTF-8,不行;

又在<%@ page contentType="text/html;charset=gb2312">进行编码替换,不行;

修改linux LANG=zh_CN.GB2312,不行;

修改web.xml的charset,不行;

此时我几乎已经查遍了所有有关的网页,而且找到这问题和smartupload有关。但解决的人寥寥无几,而且解决的办法也很不详细,于是在csdn上发帖,结果半天没人理会,顶都没人顶。再上开发群上问,大家都忙,也无暇顾及。继续自己调试,用System.getProperty(“file.encoding”)得到的结果是ANSI_X3.4-1968,这是个什么码?上google查了一下,全是些无用信息,此时我心里不禁有些发冷。。。NND,问题有些严重。。

当天到下班,我是没啥结果,已经头昏脑胀,不想加班了,但花大半天时间还没搞定这么一个“小问题”,实在是有些没面子,于是我向头儿保证,明天我一定解决。

回到屋里,茶不思饭不香。上QQ看看,跟一MM聊了几句,我说今天好累,她说我明天可以好好休息一下。啊?明天星期几?我一核实,靠,明天周六啊!看来老天注定要我周末加班了。

晚上没睡好,起来又是一顿查,还是没啥好办法。

第二天,11点才起床,起来煮碗面条就开始干,把那些编码用new String(str.getByte(“iso-8859-1“),“gbk“)这样的形式进行了若干中组合,不行,怎么办,看到有一个改smartupload源码的解决办法,我是很不想改源码的,因为服务器在远程,我没有root帐号,修改了类无法重启。

进展一:把formdata.jsp中<%@ page contentType="text/html;charset=gb2312">,取掉,加上<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,获取页面转码后能够正常显示中文。但是,大家都知道,这样做的后果是什么,formdta.jsp无法显示中文!这个问题更难做了,而且用response.setContentType居然对页面没有任何作用,真邪门了。

时间一点点过去,我终于动摇了,我开始试着去记忆root的密码,试了一下,我靠居然是对的。OK,终于可以大展拳脚了。

然而,smartupload的源码,居然很不好找,搜了半天没有。只好反编译了。用gel反编译出来的结果跟别人说的还不一样,就凑合着改了一下,

找到SmartUpload.java中的 public void upload(),加一个参数String charsetName,

找到这句 String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);

修改为String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,charsetName);

编译后上传,重启再试,发现有了一点进展。

进展二:部分参数能够正确读取了!

这只是表单文本框传值可以了,可文件名依然是乱码,我又折腾了半天,实在不想再去弄那个smartupload的源码了,虽然代码不多,但是我这么弄也太花时间了。(注:我觉得改源码应该可以解决问题,只是没有改完,文件名那部分需要进行处理。有兴趣的可以试试)

这时自然想到了换其他的上传包,搜了一下,有人说javazoom的不错,搞一个下来再说,demo很简单,

测试之后发现,只要在接收页面getdata.jsp中转码就可以了。转码方式,可以是一个个参数单独转,也可以用一句话就可以:request.setCharacterEncoding("GBK");同时要配合

MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");

这个uploadbean的做的非常体贴,居然提供一个ChineseUpload.jsp例子,其实主要就是上面两句话不同。

等我修改完,感觉差不多的时候,已经是深夜2点。想放松了,先睡再说。

周日,继续工作,发现一个新问题,uploadbean居然不能修改上传的文件名!这怎么行呢?是有一种变通方法,每个文件建立一个目录,然后放进去防止重名,但这有点恶心,而且直接进去的文件名还是乱码,这可咋整啊???

还好,我再次发现了UploadBean的优越性,我找到了一个帖子,说UploadBean1.5配合Filemover可以改名,于是又下了1.5和FileMover,FileMover中的例子也很详细简单。真是贴心。。。

修改,上传重启,一切OK!

后来,又发现系统的几个相关BUG,一鼓作气,全部解决。

这个“小问题”,居然花了我整整两天的时间,可谓令我恼怒!同时,也想到跟我同样痛苦的兄弟们,我能减轻一下你们的痛苦,我这两天就没白干!我现在的口号是:“放弃SmartUpload,全面使用UploadBean”。我还写了一个Demo,以帮助痛苦的兄弟们快速解决问题。

下面,我把我写的Demo和需要的资料链接都贴在这里,大家有什么问题可以在这里跟我交流。

二、UploadBean上传解决方案

满意指数:五星

完成程度:100%

Demo:

1.表单页面sssformdata.jsp

<%@ page contentType="text/html;charset=gb2312" %>

<head>

<title>fbysss UploadBean 示例</title>

<!--meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"-->

<!--meta http-equiv="Content-Type" content="text/html; charset=gb2312"-->

</head>

<FORM name="form1" METHOD="POST" ACTION="sssupload.jsp" ENCTYPE="multipart/form-data">

<input name="title" type= "text" value="中文字">

<td class="bodystyle">附件</td>

<td class="bodystyle"> <input name="attach" type="FILE" id="attach" size="50" > </td>

<input name="ok" type= "submit" value="提交">

</form>

2.读取表单页面sssgetdata.jsp

<!--

//==========================================================================

//文件:UploadBean上传实例

//功能:解决中文乱码,完成文件上传,并提供上传改名解决方案

//作者:fbysss

//msn:jameslastchina@hotmail.com

//==========================================================================

-->

<%@ page contentType="text/html;charset=GBK" %>

<%@ page language="java" import="com.jspsmart.upload.*"%>

<%@ page import="java.text.SimpleDateFormat"%>

<%@ page import="java.io.File"%>

<%@ page import="java.util.*"%>

<%@ page import="javazoom.upload.*"%>

<%@ page import="uploadutilities.FileMover"%>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<%

request.setCharacterEncoding("GBK");//设置编码格式,就不用一个个转码了。

FileMover fileMover = new FileMover();//你也可以使用自带的实例中jsp:useBean的形式。

UploadBean upBean = new UploadBean();

MultipartFormDataRequest mrequest = null;

Hashtable files = null;

if (MultipartFormDataRequest.isMultipartFormData(request))

{

mrequest = new MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");//注意这里也要设置编码参数

String sTt0 = mrequest.getParameter("title");

out.println("<br>Title0是:"+sTt0+"<br>");

String sTt1 = new String(sTt0.getBytes("ISO-8859-1"),"GBK");

out.println("<br>Title1是:"+sTt1+"<br>");

//这里用来测试title参数是否正确。调试的时候,加一句if (true)return;即可。

files = mrequest.getFiles();

}

//获取修改前的文件名

String sOldFileName =mrequest.getParameter("oldfilename");

out.println("sOldFileName:"+sOldFileName);

String sWebRootPath = request.getRealPath("/");//得到你的web应用的根。

String sPath=sWebRootPath+"attach";

int iFileCount = 0;

String sServerFileName="";

String sLocalFileName = "";

//文件获取

if ( (files != null) || (!files.isEmpty()) ) {

iFileCount = files.size();

UploadFile file = (UploadFile) files.get("attach");

sLocalFileName=file.getFileName();

out.println("sLocalFileName:"+sLocalFileName);

int ii= sLocalFileName.indexOf("."); //取文件名的后缀

String sExt = sLocalFileName.substring(ii,sLocalFileName.length());

//得到不重复的文件名

java.util.Date dt = new java.util.Date(System.currentTimeMillis());

SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");

sServerFileName= fmt.format(dt);

sServerFileName =sServerFileName + sExt;

//如果不存在该目录,则新建一个

File dir =new File(sPath);

if (!dir.exists()){

dir.mkdirs();

}

upBean.setFolderstore(sPath);//设置要上传的目录

upBean.addUploadListener(fileMover);//增加filMover监听

fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名

upBean.store(mrequest, "attach");//上传

out.println("file path is "+sPath+"/"+sServerFileName);

}

%>

Demo注意事项:cos.jar,uploadbean.jar,filemover.jar这几个包必须有。

必备下载地址:

UploadBean1.5:http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip

FileMover1.3:http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip

参考下载地址:

ChinesUpload例子:http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有