仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1907|回复: 20
打印 上一主题 下一主题

[学习教程] JAVA教程之JSP SmartUpload上传文件乱码办理纪实+...

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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优点之一。
深爱那片海 该用户已被删除
沙发
发表于 2015-1-21 09:37:42 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-27 05:58:40 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
简单生活 该用户已被删除
地板
发表于 2015-2-4 23:09:39 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
不帅 该用户已被删除
5#
发表于 2015-2-8 12:29:07 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
山那边是海 该用户已被删除
6#
发表于 2015-2-11 08:24:22 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
柔情似水 该用户已被删除
7#
发表于 2015-2-13 13:15:54 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-3 21:49:02 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
海妖 该用户已被删除
9#
发表于 2015-3-10 17:46:23 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
小妖女 该用户已被删除
10#
 楼主| 发表于 2015-3-11 05:53:57 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
因胸联盟 该用户已被删除
11#
发表于 2015-3-12 02:10:54 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
再见西城 该用户已被删除
12#
发表于 2015-3-19 17:31:46 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
兰色精灵 该用户已被删除
13#
发表于 2015-3-23 18:04:04 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
蒙在股里 该用户已被删除
14#
发表于 2015-3-24 14:03:27 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
老尸 该用户已被删除
15#
发表于 2015-3-29 13:07:30 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
再现理想 该用户已被删除
16#
发表于 2015-4-21 20:34:24 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
若天明 该用户已被删除
17#
发表于 2015-4-22 06:21:08 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
乐观 该用户已被删除
18#
发表于 2015-4-25 12:58:24 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
admin 该用户已被删除
19#
发表于 2015-4-25 23:48:26 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
飘灵儿 该用户已被删除
20#
发表于 2015-5-6 02:11:49 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 14:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表