我有一个ASP.Net MVC Web应用程序,该应用程序需要处理文件上传进度。
为此,我创建了一个自定义IHttpHandler
,该自定义ProcessRequest
使用$.ajax({
url: '@Url.RouteUrl("Uploads")',
type: 'POST',
headers: { 'Filename': file.name },
data: formData,
cache: false,
contentType: false,
processData: false,
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
$('progress').attr({
value: e.loaded,
max: e.total,
});
}
}, false);
}
myXhr.addEventListener('load', function (e) {
console.log('upload complete');
});
return myXhr;
}
});
方法来分块处理文件流。对于我的问题来说,实现这一点并不重要。
客户端我正在使用JQuery通过AJAX函数上传文件,如下所示:
Application_BeginRequest()
我已经在web.config中配置了上传/请求限制,以允许最大2GB的文件,据我所知,这仍然是IIS中的硬限制。
问题
我遇到的问题是,当用户尝试上传大于限制的文件时,在整个文件传输完毕之前,它不会引发错误,对于大型文件可能要花几分钟。对于用户来说,这是一种不希望的用户体验,必须等待传输完成才被告知无法处理。
问题
所以我的问题是,如果文件太大,是否在上载开始后立即使ajax函数出错?理想情况下,如果无论如何它只会被拒绝,我不希望将文件发送到服务器。
其他信息
有关其他信息,仅当文件大小在限制范围内时,才会击中IHttpHandler代码中的断点,因此我无法在其中执行任何操作以引发错误。
请注意,我不正在寻找一种解决方案,该解决方案涉及使用客户端大小上的javascript检查文件大小。尽管无论如何我都可能将其用作用户友好的预防措施,但我想找到一种方法,该方法会导致上传过程在发送所有数据之前失败并中止。但是,我愿意接受不依赖文件大小检查的客户端更改,例如ajax函数的替代选项。
我也尝试过使用this.child = React.createRef()
,但是如果文件大于2GB,则不会调用此函数,而且我不确定是否可以再检查一次此事件。
答案 0 :(得分:0)
您可以在调用ajax之前检查formData
的大小。
var size = formData.get('fileName_key').size // calculate your size accordingly
if(size>your_2gb_size) return false;
$.ajax({
url: '@Url.RouteUrl("Uploads")',
type: 'POST',
headers: { 'Filename': file.name },
data: formData,
cache: false,
contentType: false,
processData: false,
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
myXhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
$('progress').attr({
value: e.loaded,
max: e.total,
});
}
}, false);
}
myXhr.addEventListener('load', function (e) {
console.log('upload complete');
});
return myXhr;
}
});