轉載請注明:TheViperhttp://www.49028c.com/TheViper
在pc端上傳,往往為了兼容性,會使用flash(如swfupload,uploadify)以獲得更好的用戶體驗。
但是如果后臺是spring mvc且瀏覽器是IE的話,服務器不會返回數據到flash,進而觸發FileReference的DataEvent.UPLOAD_COMPLETE_DATA事件,執行回調對頁面做相應變化。奇怪的是在非IE瀏覽器中,flash就能得到返回的數據。
把log4j級別改成debug.
IE
非IE
可以看到兩個都收到flash傳過來的multipart file內容,但是IE debug中有個HttpMediaTypeNotAcceptableException。文檔上說的是Exception thrown when the request handler cannot generate a response that is acceptable by the client。這下就明白了,后臺返回的響應不被flash接受。
那么這個問題是怎么冒出來的?
好在flash上傳在本屌的node js后臺上可以運行。下面就看下IE下flash上傳請求的頭信息。
而非IE下
注意到IE下頭信息里面的accept:'text/*'.本屌的spring mvc后臺返回的是json.而且用的是最直接的方式。@RequestMapping(value="/upload1",produces {"application/json;charset=UTF-8"})。也就是說響應是Content-Type:application/json;charset=UTF-8。而這時flash只接受Content-Type:text/*(text/html,text/xml...)的響應。非IE下的頭信息accept是*/*,可以接受content-type為任何類型的響應,flash當然可以接受后臺響應了。
知道問題出在哪就好改了,本屌這里就直接把application/json改成text/*.如果用的其他方式返回json或其他形式數據,也要注意把響應的content-type設為和flash的accept一致。具體的本屌就不說了。
另外,如果修改flash源碼,對上傳的URLRequest修改accept是沒用的,上傳的時候accept還是flash在不同瀏覽器中的默認值。
var request:URLRequest=new URLRequest('http://localhost:8080/qzone/photo/upload1'); var header:URLRequestHeader = new URLRequestHeader("accept", "application/json"); request.requestHeaders.push(header);
新聞熱點
疑難解答