Valums Ajax File Upload在IE中工作,但在Firefox中不起作用
本文关键字:工作 Firefox 不起作用 但在 IE Ajax File Upload Valums | 更新日期: 2023-09-27 18:33:53
我正在 ASP.NET MVC3 中开发,我有下面的代码将文件保存在 Sql Server 2008 中,它适用于 IE(我使用了 IE9),但在 Firefox 中我收到错误"索引超出范围。必须为非负数且小于集合的大小。''r'参数名称:索引",我应该如何解决这个问题?谢谢
[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");
}
Valums Ajax 上传有 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 的浏览器的情况下,文件直接写入请求正文,而对于不支持文件 API 的浏览器,文件数据使用标准multipart/form-data
编码传输。