0

ASP.NET MVC3で開発していて、SQL Server 2008でファイルを保存するための以下のコードがあります。これは、IE(IE9を使用)では正常に機能しますが、Firefoxでは「インデックスが範囲外でした。負ではなく、コレクションのサイズ未満である必要があります。\ r \ nパラメータ名:インデックス "、これを修正するにはどうすればよいですか?ありがとう

[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");
    }
4

1 に答える 1

2

ValumsAjaxアップロードには2つのモードがあります。ブラウザがHTML5ファイルAPIをサポートしていることを認識した場合(間違いなくFireFoxの場合です)、リクエストを使用する代わりにこのAPIを使用しますenctype="multipart/form-data"。したがって、コントローラーアクションでは、これらの違いを考慮する必要があります。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エンコーディングを使用します。

于 2012-05-13T09:00:06.360 に答える