2012-05-12 19 views
0

私はASP.NET MVC3で開発していますが、以下のコードをSql Server 2008で保存しています。 Firefoxでは、「インデックスが範囲外です」というエラーが表示されます。コレクションのサイズよりも小さくなく、負でない必要があります。\ r \ nパラメータ名:インデックス "これをどのように修正する必要がありますか?ありがとうバルスAjaxファイルアップロードはIEでは動作しますが、Firefoxでは動作しません

[HttpPost] 
    public ActionResult FileUpload(string qqfile) 
    { 
     try 
     { 
      HttpPostedFileBase postedFile = Request.Files[0]; 
      var stream = postedFile.InputStream; 
      App_MessageAttachment NewAttachment = new App_MessageAttachment 
      { 
       FileName = postedFile.FileName.ToString().Substring(postedFile.FileName.ToString().LastIndexOf('\\') + 1), 
       FilteContentType = postedFile.ContentType, 
       MessageId = 4, 
       FileData = new byte[postedFile.ContentLength] 
      }; 
      postedFile.InputStream.Read(NewAttachment.FileData, 0, postedFile.ContentLength); 
      db.App_MessageAttachments.InsertOnSubmit(NewAttachment); 
      db.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      return Json(new { success = false, message = ex.Message }, "application/json"); 
     } 
     return Json(new { success = true }, "text/html"); 
    } 

答えて

2

バルスAjaxのアップロードには2つのモードがあります。ブラウザがHTML5 File APIをサポートしていることを認識した場合(確かにFireFoxの場合)、enctype="multipart/form-data"リクエストを使用する代わりにこのAPIを使用します。だからあなたのコントローラにあなたがそれらの違いのためとHTML5をサポートする最近のブラウザの場合に考慮する必要があり、アクションが直接Request.InputStreamをお読みください。

[HttpPost] 
public ActionResult FileUpload(string qqfile) 
{ 
    try 
    { 
     var stream = Request.InputStream; 
     var filename = Path.GetFileName(qqfile); 

     // TODO: not sure about the content type. Check 
     // with the documentation how is the content type 
     // for the file transmitted in the case of HTML5 File API 
     var contentType = Request.ContentType; 
     if (string.IsNullOrEmpty(qqfile)) 
     { 
      // IE 
      var postedFile = Request.Files[0]; 
      stream = postedFile.InputStream; 
      filename = Path.GetFileName(postedFile.FileName); 
      contentType = postedFile.ContentType; 
     } 
     var contentLength = stream.Length; 

     var newAttachment = new App_MessageAttachment 
     { 
      FileName = filename, 
      FilteContentType = contentType, 
      MessageId = 4, 
      FileData = new byte[contentLength] 
     }; 
     stream.Read(newAttachment.FileData, 0, contentLength); 
     db.App_MessageAttachments.InsertOnSubmit(newAttachment); 
     db.SubmitChanges(); 
    } 
    catch (Exception ex) 
    { 
     return Json(new { success = false, message = ex.Message }); 
    } 
    return Json(new { success = true }, "text/html"); 
} 

をコードでは、いくつかの調整が必要になる場合があります。私は今すぐテストする時間はありませんが、HTML5対応のブラウザの場合、リクエストの本文にファイルが直接書き込まれますが、File APIをサポートしていないブラウザの場合はファイルデータが送信されます標準multipart/form-dataエンコーディングを使用します。

関連する問題