【问题标题】:Check filesize before uploading to file system在上传到文件系统之前检查文件大小
【发布时间】:2015-05-27 19:27:54
【问题描述】:

只是一个简单的问题,

我已经对此进行了大量研究,但我有不同的方法。

我的问题:我有一个文件上传器,它适用于所有使用 VB 的 asp.net 浏览器。问题是我们的系统只允许上传不超过 1mb 的文件。现在,使用后端检查,它会告诉用户文件是否太大,并且他们必须上传一个较小的文件。然而,奇怪的问题是它会捕获一个超过限制 2-3mb 的文件。例如,如果文件为 20mb,则不会。如果上传它,我会收到一个令人讨厌的调试错误,说明已请求最大文件大小。

我想做的是快速检查前端,以防止它被发送到后端。

我用过:

$(function(){
    $('#File1').bind('change', function() {
          alert(this.files[0].size);
        });
});

检查文件大小。它适用于 chrome 和 firefox。但不是 IE。我听说如果用户在隐私设置中允许,使用 ActiveX 可以工作。

我可以使用浏览器检测说“嘿,如果 IE 执行 activeX,则执行 jQuery”但是我想知道是否有比 ActiveX 更可靠的方法?

【问题讨论】:

  • 什么是this.files?需要moar代码。发布 html 和任何其他相关的 javascript。还要在 IE 中发布“不工作”的含义。它根本不运行吗?它会抛出错误吗?消息是什么?
  • 您的问题标签是 VB.Net .... 这不是 VB 代码!

标签: javascript asp.net internet-explorer file-upload activex


【解决方案1】:

您的问题是因为 10 之前的所有 IE 版本都不支持 HTML5 File API。因此,考虑到 this 是您的 HTMLInputElement,以下内容将不起作用:

this.files[0].size;

原因是 HTMLInputElement.FileList 不存在,因为缺少文件 API 支持,但是您可以使用 HTMLInputElement.value 获取文件名。但这不是你想要的。您想获取文件的大小。再一次,由于缺少 File API 支持,IE

第一个解决方案(客户端 - jQuery)

你提议:

我可以使用浏览器检测说“嘿,如果 IE 执行 activeX,则执行 jQuery”

如果你想这样做,你可以有类似的东西:

$(function(){
    $('#File1').bind('change', function() {
        var maxFileSize = 1024000; // 1MB -> 1000 * 1024
        var fileSize;

        // If current browser is IE < 10, use ActiveX
        if (isIE() && isIE() < 10) {
            var filePath = this.value;
            if (filePath != '') {
                var AxFSObj = new ActiveXObject("Scripting.FileSystemObject");
                var AxFSObjFile = AxFSObj.getFile(filePath);
                fileSize = AxFSObjFile.size;
            }
        } else {
            // IE >= 10 or not IE

            if (this.value != '') {
                fileSize = this.files[0].size;
            }
        }

        if (fileSize < maxFileSize) {
            // Enable submit button and remove any error message
            $('#button_fileUpload').prop('disabled', false);
            $('#lbl_uploadMessage').text('');
        } else {
            // Disable submit button and show error message
            $('#button_fileUpload').prop('disabled', true);
            $('#lbl_uploadMessage').text('File too big !');
        }
    });
});

// Check if the browser is Internet Explorer
function isIE() {
    var myNav = navigator.userAgent.toLowerCase();
    return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
} 

警告!

在盲目复制此代码之前,请注意 ActiveX 解决方案确实很差。要使其工作,用户必须更改其Internet Options。此外,此解决方案不适用于公共站点,仅适用于 Intranet 应用程序。

但我想知道是否有比 ActiveX 更可靠的方法?

不,IE没有

第二种解决方案(jQuery插件)

您可以使用jQuery File Upload。你可以很容易地得到它的大小。

第三种解决方案(服务器端 - VB.NET)

考虑到您有这些 asp 控件:

<asp:FileUpload ID="fileUpload" runat="server" />
<asp:Button ID="button_fileUpload" runat="server" Text="Upload File" />
<asp:Label ID="lbl_uploadMessage" runat="server" Text="" ForeColor="Red" />

一旦与服务器端进行交互,您就可以检查选择的文件大小。例如,在这里,一旦用户单击上传按钮,我就会检查文件的大小。

Protected Sub btnFileUpload_click(ByVal sender As Object, ByVal e As System.EventArgs) Handles button_fileUpload.Click
    ' A temporary folder
    Dim savePath As String = "c:\temp\uploads\"
    If (fileUpload.HasFile) Then
        Dim fileSize As Integer = fileUpload.PostedFile.ContentLength
        ' 1MB -> 1000 * 1024
        If (fileSize < 1024000) Then
            savePath += Server.HtmlEncode(fileUpload.FileName)

            fileUpload.SaveAs(savePath)

            lbl_uploadMessage.Text = "Your file was uploaded successfully."

        Else
            lbl_uploadMessage.Text = "Your file was not uploaded because " +
                                     "it exceeds the 1 MB size limit."
        End If
    Else
        lbl_uploadMessage.Text = "You did not specify a file to upload."
    End If
End Sub

编辑

正如您所说,最后一个解决方案不适用于太大的文件。要使此解决方案起作用,您必须增加 web.config 文件中的最大上传文件大小:

<configuration>
    <system.web>
        <httpRuntime maxRequestLength="52428800" /> <!--50MB-->
    </system.web>
</configuration>

【讨论】:

  • 非常好。谢谢!我已经使用了你的 VB 方法。但是,如果文件太大,它会由于某种原因跳过检查,这就是我想在客户端验证的原因。我刚看到你的编辑哈哈。我会问 IS 是否会增加它(我们不应该碰它)。我实际上找到了一个与您提供的非常相似的 jQuery 插件。我现在也实施了。最后,感谢 ActiveX 解决方案。我将把它用于 IE
  • @Christian4423 不客气。如果您在使用 ActiveX 解决方案时遇到任何问题,可以在此处发表评论,我们很乐意为您提供帮助。
  • 我得到它与 $("File1").val() 再次感谢!
  • 您使用的是 ASP.NET,所以我认为问题在于它没有找到任何具有“File1”和 id 的元素,因为 ASP.NET 会生成另一个 ID。使用 jQuery,您可以像以前那样做。但是如果要使用JavaScript,则必须使用document.getElementById('&lt;%=File1.ClientID %&gt;').value 或将fileUpload.ClientIDMode 设置为Static。自己找到解决方案的工作做得很好。
  • 谢谢你!我会使用你的document.getElementById('&lt;%=File1.ClientID %&gt;').value,因为我相信纯 JS 总是更好。我现在可以在每个浏览器中使用该解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2016-06-17
  • 2019-04-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多