問題:
使用Flash 8提供的FileReference可以方便地一次選擇多個文件上傳,不過除了在IE上以外,其它瀏覽器上的都會出現Cookie與瀏覽器不一致的問題。
解決辦法:
直接的做法就是在上傳時,附加一個session_id在URL上,在服務端處理時使用這個Session。
在Rails中,可以把_session_id=xxxx附加在URL上。不過測試的結果是,附加的session_id只有在GET請求時才正常,POST請示時會被忽略。
知道了這一點,只需要尋找GET和POST請求處理的差別。也費了一番周折,才發現問題出在actionpack/lib/action_controller/cgi_ext/raw_post_data_fix.rb里。
只需要在POST時也處理一下URL參數即可。由于它是通過read_query_params方法來分開處理的,所以要在POST請求時,調用一下read_query_params(:get),并把結果合并。代碼如下:
@params.merge!(CGI.parse(read_query_params(:get))) if method == :post || method == :put
這行加到initialize_query方法尾部即可。由于原來的方法可能返回了@params,所以也加一行@params在結尾,以免造成不必要的麻煩。