以前、jquery Uploadify アップロード プラグインの使用方法を紹介しましたが、使用中に Http Error 302 エラーの問題が発生したので、ここに記録します。
まず、http 302 はリクエストがリダイレクトされたことを意味します。これは理解しやすいですが、uploadify 処理のアップロード スクリプトにセッション検証がある場合、Flash にはポスト リクエストの実行時に Cookie 情報が含まれていないため、このエラーが発生します。 session はクライアントの Cookie に基づいて SESSIONID を取得します。当然、Cookie を送信せずにセッションを取得することはできず、uploadify は 302 (リクエスト リダイレクト) エラーを返します。
解決策:
<script> $(document).ready(function() { $('#file_upload').uploadify({ 'uploader' : 'uploadify/uploadify.swf', 'script' : 'uploadify.php', 'folder' : 'uploads/file', 'formData': { 'session': '<?php echo session_id();?>'}, 'onComplete' : function(event, ID, fileObj, response, data) { alert(response); } }); }); </script>
if (isset($_POST['session'])){ session_id($_POST['session']); session_start();//注意此函数要在session_id之后 }
問題の拡張: uploadify3.1 IEを使用したMVC下の通常のFirefoxおよびChromeでもHTTPERROR 302エラーが発生します。解決策はありますか?
jquery Uploadify は IE で通常どおりアップロードできます。非同期アップロードを実装すると、アップロード時に各ファイルがサーバーにリクエストを送信します。各リクエストには、セキュリティ検証、セッションおよび Cookie の検証が必要です。はい、それだけです。 jquery Uploadify はフラッシュを使用してアップロードを実装するため、データ フロー リクエストがバックグラウンドに送信されるたびに、IE はローカル Cookie ストレージを自動的にバンドルしてサーバーに送信します。しかし、Firefox と Chrome はこれを行わず、安全ではないと考えるでしょう。まず、次のコンテンツを global.asxa に追加する必要があります
protected void Application_BeginRequest(object sender, EventArgs e) { /* we guess at this point session is not already retrieved by application so we recreate cookie with the session id... */ try { string session_param_name = "ASPSESSID"; string session_cookie_name = "ASP.NET_SessionId"; if (HttpContext.Current.Request.Form[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.Form[session_param_name]); } else if (HttpContext.Current.Request.QueryString[session_param_name] != null) { UpdateCookie(session_cookie_name, HttpContext.Current.Request.QueryString[session_param_name]); } } catch { } try { string auth_param_name = "AUTHID"; string auth_cookie_name = FormsAuthentication.FormsCookieName; if (HttpContext.Current.Request.Form[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.Form[auth_param_name]); } else if (HttpContext.Current.Request.QueryString[auth_param_name] != null) { UpdateCookie(auth_cookie_name, HttpContext.Current.Request.QueryString[auth_param_name]); } } catch { } } private void UpdateCookie(string cookie_name, string cookie_value) { HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name); if (null == cookie) { cookie = new HttpCookie(cookie_name); } cookie.Value = cookie_value; HttpContext.Current.Request.Cookies.Set(cookie); }
<script type="text/javascript"> var auth = "@(Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value)"; var ASPSESSID = "@Session.SessionID"; $(function () { $('#upload').uploadify({ 'formData': { 'folder': '/Upload', 'ASPSESSID': ASPSESSID, 'AUTHID': auth }, 'buttonText': '浏览', 'buttonClass': 'browser', 'fileSizeLimit' : '100KB', 'fileTypeExts': '*.xls;*.xlsx', 'removeCompleted': false, 'swf': '@Url.Content("~/Scripts/Uploadify/uploadify.swf")', 'uploader': '/Upload', 'onUploadSuccess': function (file, data, response) {} }); }); </script>