现在在做一个手机版的Blog网站,WAP1.x WAP2.0 Struts2
spring hibernate
- 项目里面既有wml(WAP 1.x)又有xhtml(WAP 2.0)所以contenType一定要写成这个样子:
<property name="contentType">
<value>application/vnd.wap.xhtml+xml; charset=UTF-8</value>
</property>
如果只有wml可以写成application/vnd.wap
ko.cn (空中网)是 text/vnd.wap.wml;charset=UTF-8
wap.baidu.com wap版: text/vnd.wap.wml;charset=UTF-8
xhtml版:application/xhtml+xml
wap.pdx.cn(万蝶网) text/vnd.wap.wml;charset=UTF-8
不知道为什么一定要加charset=UTF-8 否则浏览器会把页面当成是一个文件,一访问就问你要不要下载,其实我们项目里还有PC版的内容 所以是在每个手机版的action中指定contentType
<action name="login" class="。。。。。.LoginAction" method="login">
<result name="success">
<param name="location">/pages/wap/user_info.ftl</param>
<param name="contentType">
application/vnd.wap.xhtml+xml; charset=UTF-8
</param>
</result>
<result name="input">
。。。。。
</result>
</action>
- 目前WAP 1.X还只能通过彩信业务上传图片
- WAP2.0(xthml)中使用<input type="file">上传文件必须指定enctype="multipart/form-data" method="post"
使用multipart/form-data模式时,HTTPRequest的内容不是KEY:VALUE的格式而是被用分隔符(Bandary)分成多个部分的数据流,bandary由浏览器生成,有的是一组复杂的随机数为的是与真正的数据区分开
- 通过<input type="file">上传时服务器总是报文件为空,但是文件名等信息还是在的
于是将手机上传的request和PC上传的request打印出来进行比较
做Filter拦截request
InputStream is = request.getInputStream();
FileOutputStream fs = new FileOutputStream("c:/out.text");
byte[] buffer = new byte[1024];
int byteread = 0;
while ((byteread = is.read(buffer)) != -1) {
fs.write(buffer, 0, byteread);
}
手机版上传的request
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="struts.token.name";
struts.token
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="struts.token";
Q0DRQ8WNNX164DOMQQUPGQ0H4S01KS4W
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="picture.name";
kmtp
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="categoryId";
689
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="photo"; filename="wps://FLASH/pht/gen/SB.jpg.jpg"
Content-Type: image/jpeg
--******_EMBIDER_MULTIPART_BOUNDARY_******
Content-Disposition: form-data; name="picture.description";
--******_EMBIDER_MULTIPART_BOUNDARY_******--
PC上传的request
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="struts.token.name"
struts.token
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="struts.token"
73ZFOP68ALP9CNKDIDBK2AG9HLX86K0R
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="picture.name"
from pc
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="categoryId"
689
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="photo"; filename="Skypahontas.png"
Content-Type: image/png
塒NG
IHDR ` ` 鈽w8 sBIT|d? pHYs 逸~? %tEXtSoftware Macromedia Fireworks MX 2004噕 tEXtCreation Time 11/7/05壣唒 -IDATx滍統?Wy?9缭译綮?砘-[迧dY?^€伉?醊H笜礞^ BH竃HX!,I| 0?a駟
偏l 賈,蚳泒闄^渟?Y秄$?铥<5]]S誡烑=飝消?諾??0??馃K,?嘣礩鐢}爷県≌hO8攍 @揌爥?-鼏玝悕.S.炻Z塉@T褫6\?€8﹞?≌?馪?sQ榀~tru3棿溋籛q綷娏"k€Z1X颽b蟔?'??
虑司奬菦q??8?8
X番残塜鐕lj喭])赱欼$?9諚&;窄綫~?x!9鶹燂9c?︸f/?锄S楆?{$槤j鵒E纜錢諘?鱐?娠D?M?yI=腆?|??詭S|兜某 IEND瓸`
------------oLFSA1p2rcCZQCkW4ECi1x
Content-Disposition: form-data; name="picture.description"
------------oLFSA1p2rcCZQCkW4ECi1x--
发现手机根本就没有把图片内容上传。我们测试用的手机是MOTO KRCR,而且在wap.pdx.cn wap.baidu.com上效果相同。
又找了一部Nokia NXX在上面安装Opera,结果不能生成bandary直接被reject掉
SonyEricsson可以把图片内容传上来但是编码又不对。。。。
不知道是手机的问题 还是我们的程序有问题。
感觉现在手机上的浏览器还比较混乱,缺少统一的标准或者没有人来支持标准。