C# 使用asp文件上传器上传超过4 mb的图像?

C# 使用asp文件上传器上传超过4 mb的图像?,c#,javascript,asp.net,ajax,jquery,C#,Javascript,Asp.net,Ajax,Jquery,我正在使用asp文件上载程序,通过该程序,我可以通过单击按钮上载图像。每当我上载超过4 mb的图像时,它都会崩溃。如果我在配置中为maxrequestlength定义了一个大小 如果我再次超过文件大小,它就会崩溃。如果上传了一个大文件,是否可以限制用户并显示免责声明消息。我的意图是让用户知道文件是巨大的 aspx页 <tr> <td align="center" class="title" colspan="2">

我正在使用asp文件上载程序,通过该程序,我可以通过单击按钮上载图像。每当我上载超过4 mb的图像时,它都会崩溃。如果我在配置中为maxrequestlength定义了一个大小 如果我再次超过文件大小,它就会崩溃。如果上传了一个大文件,是否可以限制用户并显示免责声明消息。我的意图是让用户知道文件是巨大的

aspx页

<tr>
                    <td align="center" class="title" colspan="2">
                        Image Upload
                    </td>
                </tr>
                <tr>
                    <td align="center" colspan="2">
                        <asp:Label ID="lblImageDisclaimer" runat="server" Text="Please upload an image file less than 3MB in size"
                            Font-Bold="true" ForeColor="Highlight"></asp:Label>
                    </td>
                </tr>
                <tr>
                    <td align="center" colspan="2">
                        <asp:DropDownList ID="ddlImageType" runat="server" AutoPostBack="false" OnSelectedIndexChanged="ddlImageType_SelectedIndexChanged">
                        </asp:DropDownList>
                    </td>
                </tr>
                <tr>
                    <td align="center" colspan="2" id="tdUpload" runat="server">
                        <asp:Label ID="lblImage1" runat="server" Text="Upload images : " Font-Bold="true"></asp:Label>
                        &nbsp;
                        <asp:FileUpload ID="fileUploader" runat="server" /><asp:Button ID="btnUpload" CssClass="button"
                            runat="server" Text="Upload" OnClick="btnUpload_Click" OnClientClick="javascript:return validateFile();" />
                        <asp:Label ID="lblMessage" runat="server" Text="" CssClass="errorText"></asp:Label>
                    </td>
                </tr>
                <tr>
                    <td id="Td2" runat="server" align="center" colspan="1">
                        <asp:Label ID="Label1" runat="server" Text="SCREENSHOT 1" Font-Bold="true"></asp:Label>
                    </td>
                    <td id="Td3" runat="server" align="center" colspan="1">
                        <asp:Label ID="Label2" runat="server" Text="SCREENSHOT 2" Font-Bold="true"></asp:Label>
                    </td>
                </tr>
                <tr>
                    <td id="imgHolder" runat="server" align="center" colspan="1">
                        <div style="border: SOLID 1px BLACK; width: 575px; height: 250px; overflow: auto;">
                            <%--<asp:Image ID="imgPreview" runat="server" ImageUrl="~/FIRE/ImageHandler.ashx?id=1&imageNo=2" />--%>
                            <asp:Image ID="imgPreview" runat="server" />
                        </div>
                    </td>
                    <td id="imgHolder2" runat="server" align="center" colspan="1">
                        <div style="border: SOLID 1px BLACK; width: 575px; height: 250px; overflow: auto;">
                            <%--<asp:Image ID="imgPreview" runat="server" ImageUrl="~/FIRE/ImageHandler.ashx?id=1&imageNo=2" />--%>
                            <asp:Image ID="imgPreview2" runat="server" />
                        </div>
                    </td>
                </tr>
                <tr>
                    <td id="tdDelete1" align="left" style="width: 100%; padding-left: 15px;" colspan="1">
                        <asp:Button ID="btnDelete1" runat="server" Text="Delete" CssClass="button" OnClick="btnDelete_Click"
                            ToolTip="Click to Delete" OnClientClick="javascript:return  confirm('Are you sure you want to delete this image?');" />
                    </td>
                    <td id="tdDelete2" align="left" style="width: 100%" colspan="1">
                        <asp:Button ID="btnDelete2" runat="server" Text="Delete" CssClass="button" OnClick="btnDelete_Click"
                            ToolTip="Click to Delete" OnClientClick="javascript:return  confirm('Are you sure you want to delete this image?');" />
                    </td>
                </tr>
在这里,我限制大小为3145728 并以客户端大小处理它

function validateFile() {
            var strFileName = document.getElementById('<%=fileUploader.ClientID %>').value;
            var strExtName = strFileName.substring(strFileName.lastIndexOf('.')).toLowerCase();
            var objFSO = new ActiveXObject("Scripting.FileSystemObject");
            var e = objFSO.getFile(strFileName);
            var fileSize = e.size;
            //file size limit for 3mb
            if (fileSize > 3145728) {
                alert("Maximum size of uploaded file should be less than 3 MB.");
                return false;
            }
            else
                return true;
        }

根据一些客户端问题,我无法使用ActiveXObject。简短的回答是“否”。您不能使用代码捕获大文件并通知用户,因为在执行任何代码之前都会检查IIS设置,因此为时已晚

如果您想要更好的用户体验,那么我建议您研究一些开源解决方案,如下所示:

  • 自定义HTTP模块

    这是一个自由的选择

  • Silverlight/Flash选项

    这是一个自由的选择

  • 异步分块选项

    是一个支付选项,请查看网站的定价


  • 简而言之,答案是“否”。您不能使用代码捕获大文件并通知用户,因为在执行任何代码之前都会检查IIS设置,因此为时已晚

    如果您想要更好的用户体验,那么我建议您研究一些开源解决方案,如下所示:

  • 自定义HTTP模块

    这是一个自由的选择

  • Silverlight/Flash选项

    这是一个自由的选择

  • 异步分块选项

    是一个支付选项,请查看网站的定价


  • 假设您没有使用HTML5。假设您没有按照Karl的建议使用自定义/第三方组件

    (1) 您需要首先在web.config中限制IIS的上载大小:

    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="YOUR_MAX_ALLOWED_SIZE IN BYTES"/>
            </requestFiltering>
        </security>
    </system.webServer>
    
    除非您使用的是HTML5文件API,否则无法在客户端检查它。因此,用户必须等待整个文件被上传,然后将其最大化。因此,请仔细设置允许的最大尺寸

    更新

    如您所见,如果尺寸超过限制,则很难捕获。有几个变通办法:

  • 设置自定义错误:

  • 设置
    system.webServer
    部分中的
    httpErrors


  • 请参见Marcus在此处接受的答案:

    假设您没有使用HTML5。假设您没有按照Karl的建议使用自定义/第三方组件

    (1) 您需要首先在web.config中限制IIS的上载大小:

    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="YOUR_MAX_ALLOWED_SIZE IN BYTES"/>
            </requestFiltering>
        </security>
    </system.webServer>
    
    除非您使用的是HTML5文件API,否则无法在客户端检查它。因此,用户必须等待整个文件被上传,然后将其最大化。因此,请仔细设置允许的最大尺寸

    更新

    如您所见,如果尺寸超过限制,则很难捕获。有几个变通办法:

  • 设置自定义错误:

  • 设置
    system.webServer
    部分中的
    httpErrors


  • 请参见Marcus在此处接受的答案:

    我可以使用AjaxFileUploader吗?如果您专门针对HTML5浏览器,则可以在上载之前使用
    HTML5文件API
    ,获得文件大小,但如果您有任何用户使用基于HTML4的浏览器,则这将退出窗口。如果您阅读了ASP.NET AJAX AjaxFileUploader的文档,它会说它需要HTML5作为进度反馈;否则它会显示一个微调器。因此,这实际上取决于HTML5与否;HTML5提供了很多可能性,但要注意,并非所有版本的IE都支持所有HTML5功能;查看网站。我可以使用AjaxFileUploader吗?如果您专门针对HTML5浏览器,那么是的,您可以在上传之前使用
    HTML5文件API
    ,获得文件大小,但是如果您有任何用户使用基于HTML4的浏览器,那么这将被排除在外。如果您阅读了ASP.NET AJAX AjaxFileUploader的文档,它会说它需要HTML5作为进度反馈;否则它会显示一个微调器。因此,这实际上取决于HTML5与否;HTML5提供了很多可能性,但要注意,并非所有版本的IE都支持所有HTML5功能;查看网站。
    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="YOUR_MAX_ALLOWED_SIZE IN BYTES"/>
            </requestFiltering>
        </security>
    </system.webServer>
    
    <httpRuntime executionTimeout="SECONDS" maxRequestLength="YOUR_MAX_ALLOWED_SIZE IN KB"/>
    
    if (fileUpload.PostedFile.ContentLength > (YOUR_MAX_ALLOWED_SIZE - n)) {
        // where "n" is arbitrary number to intercept uploads before IIS kicks it
        // you display limit to users as (YOUR_MAX_ALLOWED_SIZE - n)
        // inform problem to the user here
    }