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

Valums Ajax 上传有 2 种模式。如果它识别出浏览器支持 HTML5 File 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 的浏览器的情况下,文件直接写入请求的主体,而对于不支持文件 API 的浏览器,文件数据被传输使用标准multipart/form-data编码。

于 2012-05-13T09:00:06.360 回答