這兩天在做FLEX上傳的時候,遇到一個問題,苦了我一天,今天終於給解決了.問題如下:
我在上傳過程中,除了上傳文件之外,還附帶有參數,我的FLEX中url設置如下:
- var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+music_name.text+"
- &singername="+singer_name.text;
var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+music_name.text+"
&singername="+singer_name.text;
顯然這裏是上傳音樂過程,順便把音樂名及歌手名上傳上去,其中音樂名與哥手名是中文,我用自己的機子開啓TOMCAT做服務器,然後開啓本地瀏覽器登陸,上傳音樂,沒一點問題,中文可以在後臺打印出來.但是通過IP訪問我的服務器時,就出現問題了,瀏覽器將"musicname="+music_name.text+"&singername="+singer_name.text"
兩個參數musicname與singername解析成了一個參數,於是後者在JSP中用request.getParameter("singername");
其結果爲null所以就報了空指針錯誤.自然上傳過程中也會報錯.那麼我是怎麼解決的呢?用代碼來說明問題.
FLEX中代碼如下:
var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp? musicname="+
encodeURIComponen(music_name.text) +"&singername="+
encodeURIComponent (singer_name.text);
var request:URLRequest = new URLRequest(url); request.method="post";
大家注意看,第二次代碼與第一次代碼中URL的不同,見紅色部分.這裏就是對中文參數進行編碼,在FLEX中默認編碼方式爲
UTF-8,這裏是對中文參數用UTF-8進行編碼,那麼在後臺我們要對其行進解碼.
JSP中,核心代碼如下:
String mp3name=new String(musicname.getBytes("ISO8859-1"),"utf-8");
String mp3singer=new String(singername.getBytes("ISO8859-1"),"utf-8");
這是一個解碼的過程.
然後經過印,就可得到我們夢寐以求的瀏覽器傳過來的中文參數了.到此,FLEX中上傳文件,附代中文參數的問題得到解決.
有些朋友照上面進行操作還可能出現亂碼問題,原因可能如下:
即在你的FLEX頁面中有如下設置:
System.useCodePage=true;
System.useCodePage=true;是用你瀏覽器的編碼方式來解行編碼,那麼你在後臺用UTF-8,或者gbk解碼都可能出現亂碼問題,甚至出現解析參數出錯.我們提供的解決方法如下
或者將 System.useCodePage=false;
或者將這句話註釋即可(默認爲false).
這個問題困惑了我兩天,今天終於解決,希望有同樣困惑的朋友能早日解決其問題.
下面附上完整代碼:
Flex:(附中文參數文件上傳部份,這裏只寫了函數部份,觸發函數的組件大家可以自己寫)
- //上傳音樂部份
- public var myFileReference:FileReference = new FileReference();
- public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");
- public var allowType:Array=new Array(mp3Type);
- private function uploadMP3():void{
- // System.useCodePage=false;//GBK
- var musicname:String=music_name.text;
- var singername:String=singer_name.text;
- if(musicname==""){
- mx.controls.Alert.show("音樂名稱不能爲空");
- }else if(singername==""){
- mx.controls.Alert.show("歌手不能爲空");
- }else if(musci_sName.text==""){
- mx.controls.Alert.show("上傳音樂不能爲空");
- }else{
- // Alert.show("歌手名:"+singername);
- // Alert.show("歌曲名"+musicname);
- var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);
- var request:URLRequest = new URLRequest(url);
- request.method="post";
- try
- {
- //上傳文件
- myFileReference.upload(request);
- CursorManager.setBusyCursor();
- // showDetail.text = "upload";
- }catch (error:Error){
- cursorManager.removeBusyCursor();
- removeAllEvent();
- mx.controls.Alert.show("上傳出錯");
- }
- }
- }
- public function browse():void{
- //瀏覽本地本地文件
- myFileReference.browse(allowType);
- //爲打開選擇框定義事件處理
- myFileReference.addEventListener(Event.SELECT, selectHandler);
- //在上傳過程中觸發的事件處理
- myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);
- // myFileReference.addEventListener(Event.COMPLETE, onComplete);
- //在上傳過程中出錯處理
- myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
- //處理返回信息
- myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
- }
- //先擇文件
- public function selectHandler(event:Event):void{
- musci_sName.text=myFileReference.name;
- }
- //取消文件上傳
- public function uploadCancel():void{
- myFileReference.cancel();
- CursorManager.removeBusyCursor();
- removeAllEvent();
- }
- //上傳過程中的事件
- public function onProcess():void{
- mx.managers.CursorManager.setBusyCursor();
- }
- import mx.managers.CursorManager;
- public function returnmsgHandler(event:DataEvent):void{
- CursorManager.removeBusyCursor();
- var result:Boolean=event.data.toString() as Boolean;
- mx.controls.Alert.show("上傳成功");
- sendRequestToGetMusicInfo();
- }
- //上傳過程中出錯處理
- public function ioErrerHandler(event:IOErrorEvent):void{
- removeAllEvent();
- CursorManager.removeBusyCursor()
- Alert.show("上傳出錯","錯誤");
- }
- //remove all the listerners
- public function removeAllEvent():void{
- myFileReference.removeEventListener(Event.SELECT, selectHandler);
- //在上傳過程中觸發的事件處理
- myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);
- // myFileReference.removeEventListener(Event.COMPLETE, onComplete);
- myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
- myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
- }
//上傳音樂部份
public var myFileReference:FileReference = new FileReference();
public var mp3Type:FileFilter=new FileFilter("MP3(*.mp3)","*.mp3");
public var allowType:Array=new Array(mp3Type);
private function uploadMP3():void{
// System.useCodePage=false;//GBK
var musicname:String=music_name.text;
var singername:String=singer_name.text;
if(musicname==""){
mx.controls.Alert.show("音樂名稱不能爲空");
}else if(singername==""){
mx.controls.Alert.show("歌手不能爲空");
}else if(musci_sName.text==""){
mx.controls.Alert.show("上傳音樂不能爲空");
}else{
// Alert.show("歌手名:"+singername);
// Alert.show("歌曲名"+musicname);
var url:String="http://202.197.108.65:8080/Flex/uploadmp3.jsp?musicname="+encodeURIComponent(music_name.text)+"&singername="+encodeURIComponent(singer_name.text);
var request:URLRequest = new URLRequest(url);
request.method="post";
try
{
//上傳文件
myFileReference.upload(request);
CursorManager.setBusyCursor();
// showDetail.text = "upload";
}catch (error:Error){
cursorManager.removeBusyCursor();
removeAllEvent();
mx.controls.Alert.show("上傳出錯");
}
}
}
public function browse():void{
//瀏覽本地本地文件
myFileReference.browse(allowType);
//爲打開選擇框定義事件處理
myFileReference.addEventListener(Event.SELECT, selectHandler);
//在上傳過程中觸發的事件處理
myFileReference.addEventListener(ProgressEvent.PROGRESS, onProcess);
// myFileReference.addEventListener(Event.COMPLETE, onComplete);
//在上傳過程中出錯處理
myFileReference.addEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
//處理返回信息
myFileReference.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
}
//先擇文件
public function selectHandler(event:Event):void{
musci_sName.text=myFileReference.name;
}
//取消文件上傳
public function uploadCancel():void{
myFileReference.cancel();
CursorManager.removeBusyCursor();
removeAllEvent();
}
//上傳過程中的事件
public function onProcess():void{
mx.managers.CursorManager.setBusyCursor();
}
import mx.managers.CursorManager;
public function returnmsgHandler(event:DataEvent):void{
CursorManager.removeBusyCursor();
var result:Boolean=event.data.toString() as Boolean;
mx.controls.Alert.show("上傳成功");
sendRequestToGetMusicInfo();
}
//上傳過程中出錯處理
public function ioErrerHandler(event:IOErrorEvent):void{
removeAllEvent();
CursorManager.removeBusyCursor()
Alert.show("上傳出錯","錯誤");
}
//remove all the listerners
public function removeAllEvent():void{
myFileReference.removeEventListener(Event.SELECT, selectHandler);
//在上傳過程中觸發的事件處理
myFileReference.removeEventListener(ProgressEvent.PROGRESS, onProcess);
// myFileReference.removeEventListener(Event.COMPLETE, onComplete);
myFileReference.removeEventListener(IOErrorEvent.IO_ERROR,ioErrerHandler);
myFileReference.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA,returnmsgHandler);
}
後代JSP中代碼如下:
- String musicname = request.getParameter("musicname");
- String singername = request.getParameter("singername");
- String mp3name=new String(musicname.getBytes("ISO8859-1"),"utf-8");
- String mp3singer=new String(singername.getBytes("ISO8859-1"),"utf-8");
- System.out.println("the muicsname:---"+mp3name);
- System.out.println("the singer name:++++++++"+mp3singer);
顯然,當你設置成