|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
通过视频学习比传统的大课堂学习更适合成人化的学习规律。有人说大课堂气氛好,学习氛围浓,热闹,可以认识很多人。js|办理|上传fbysss
声明:本文为fbysss原创,如需援用,请说明作者及援用地点
关头字:smartupload,uploadbean,linux,中文乱码
1、SmartUpload上传文件乱码办理纪实
恶心指数:五星
完成水平:80%(文件名成绩未办理)
成绩形貌:在windows下开辟的web使用,用到了smartupload上传文件,需求很复杂,就是一个表单文件formdata.jsp,一个猎取表单并上传的文件getdata.jsp,调试的时分,windows和linux体系下均一般,当体系安装到另外一台服务器的时分,却呈现了猎取表单参数值为乱码(满是问号???)的成绩。
我头脑内里第一感到是:两台呆板,据同事说是统一张光盘安装的Linux,但我想,依据逻辑揣度,一定是这liux装得纷歧样,大概是相干的服务纷歧样。不然怎样大概呢?但是,上头义务交给我来办理了,并且体系即刻要正式利用,假如我请求从头安装Linux,几近是不成能的。那好,我不上天狱,谁上天狱?我就闯它一把。
实在在这个时分,我还以为成绩不年夜的。由于java开辟的工具,乱码成绩是屡见不鲜,而办理举措也就是那几种。不就一个转码吗?事先头儿问我成绩年夜不年夜,我说,应当没啥年夜成绩。
我入手下手举行getByte()转码,用ISO-8859-1与gb312/GBK”相互转换,未果,又到场UTF-8,不可;
又在<%@pagecontentType="text/html;charset=gb2312">举行编码交换,不可;
修正linuxLANG=zh_CN.GB2312,不可;
修正web.xml的charset,不可;
此时我几近已查遍了一切有关的网页,并且找到这成绩和smartupload有关。但办理的人寥寥可数,并且办理的举措也很不具体,因而在csdn上发帖,了局半天没人剖析,顶都没人顶。再上开辟群上问,人人都忙,也得空顾及。持续本人调试,用System.getProperty(“file.encoding”)失掉的了局是ANSI_X3.4-1968,这是个甚么码?上google查了一下,满是些无用信息,此时我内心不由有些发冷。。。NND,成绩有些严峻。。
当天到上班,我是没啥了局,已头昏眼花,不想加班了,但花泰半地利间还没弄定这么一个“小成绩”,其实是有些没体面,因而我向头儿包管,今天我必定办理。
回到屋里,茶不思饭不喷鼻。上QQ看看,跟一MM聊了几句,我说明天好累,她说我今天能够好好歇息一下。啊?今天礼拜几?我一核实,靠,今天周六啊!看来老天必定要我周末加班了。
早晨没睡好,起来又是一顿查,仍是没啥好举措。
第二天,11点才起床,起来煮碗面条就入手下手干,把那些编码用newString(str.getByte(“iso-8859-1“),“gbk“)如许的情势举行了多少中组合,不可,怎样办,看到有一个改smartupload源码的办理举措,我是很不想改源码的,由于服务器在远程,我没有root帐号,修正了类没法重启。
停顿一:把formdata.jsp中<%@pagecontentType="text/html;charset=gb2312">,取失落,加上<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">,猎取页面转码后可以一般显现中文。可是,人人都晓得,如许做的成果是甚么,formdta.jsp没法显现中文!这个成绩更难做了,并且用response.setContentType竟然对页面没有任何感化,真邪门了。
工夫一点点已往,我终究坚定了,我入手下手试着往影象root的暗码,试了一下,我靠竟然是对的。OK,终究能够年夜展拳脚了。
但是,smartupload的源码,竟然很欠好找,搜了半天没有。只好反编译了。用gel反编译出来的了局跟他人说的还纷歧样,就对付着改了一下,
找到SmartUpload.java中的publicvoidupload(),加一个参数StringcharsetName,
找到这句Strings11=newString(m_binArray,m_startData,(m_endData-m_startData)+1);
修正为Strings11=newString(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和必要的材料链接都贴在这里,人人有甚么成绩能够在这里跟我交换。
2、UploadBean上传办理计划
中意指数:五星
完成水平:100%
Demo:
1.表单页面sssformdata.jsp
<%@pagecontentType="text/html;charset=gb2312"%>
<head>
<title>fbysssUploadBean示例</title>
<!--metahttp-equiv="Content-Type"content="text/html;charset=iso-8859-1"-->
<!--metahttp-equiv="Content-Type"content="text/html;charset=gb2312"-->
</head>
<FORMname="form1"METHOD="POST"ACTION="sssupload.jsp"ENCTYPE="multipart/form-data">
<inputname="title"type="text"value="中笔墨">
<tdclass="bodystyle">附件</td>
<tdclass="bodystyle"><inputname="attach"type="FILE"id="attach"size="50"></td>
<inputname="ok"type="submit"value="提交">
</form>
2.读取表单页面sssgetdata.jsp
<!--
//==========================================================================
//文件:UploadBean上传实例
//功效:办理中文乱码,完成文件上传,并供应上传更名办理计划
//fbysss
//msn:jameslastchina@hotmail.com
//==========================================================================
-->
<%@pagecontentType="text/html;charset=GBK"%>
<%@pagelanguage="java"import="com.jspsmart.upload.*"%>
<%@pageimport="java.text.SimpleDateFormat"%>
<%@pageimport="java.io.File"%>
<%@pageimport="java.util.*"%>
<%@pageimport="javazoom.upload.*"%>
<%@pageimport="uploadutilities.FileMover"%>
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
</head>
<%
request.setCharacterEncoding("GBK");//设置编码格局,就不必一个个转码了。
FileMoverfileMover=newFileMover();//你也能够利用自带的实例中jsp:useBean的情势。
UploadBeanupBean=newUploadBean();
MultipartFormDataRequestmrequest=null;
Hashtablefiles=null;
if(MultipartFormDataRequest.isMultipartFormData(request))
{
mrequest=newMultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");//注重这里也要设置编码参数
StringsTt0=mrequest.getParameter("title");
out.println("<br>Title0是:"+sTt0+"<br>");
StringsTt1=newString(sTt0.getBytes("ISO-8859-1"),"GBK");
out.println("<br>Title1是:"+sTt1+"<br>");
//这里用来测试title参数是不是准确。调试的时分,加一句if(true)return;便可。
files=mrequest.getFiles();
}
//猎取修正前的文件名
StringsOldFileName=mrequest.getParameter("oldfilename");
out.println("sOldFileName:"+sOldFileName);
StringsWebRootPath=request.getRealPath("/");//失掉你的web使用的根。
StringsPath=sWebRootPath+"attach";
intiFileCount=0;
StringsServerFileName="";
StringsLocalFileName="";
//文件猎取
if((files!=null)||(!files.isEmpty())){
iFileCount=files.size();
UploadFilefile=(UploadFile)files.get("attach");
sLocalFileName=file.getFileName();
out.println("sLocalFileName:"+sLocalFileName);
intii=sLocalFileName.indexOf(".");//取文件名的后缀
StringsExt=sLocalFileName.substring(ii,sLocalFileName.length());
//失掉不反复的文件名
java.util.Datedt=newjava.util.Date(System.currentTimeMillis());
SimpleDateFormatfmt=newSimpleDateFormat("yyyyMMddHHmmssSSS");
sServerFileName=fmt.format(dt);
sServerFileName=sServerFileName+sExt;
//假如不存在该目次,则新建一个
Filedir=newFile(sPath);
if(!dir.exists()){
dir.mkdirs();
}
upBean.setFolderstore(sPath);//设置要上传的目次
upBean.addUploadListener(fileMover);//增添filMover监听
fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名
upBean.store(mrequest,"attach");//上传
out.println("filepathis"+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
J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看NetBeans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。 |
|