2013-07-29 34 views
0

我使用的是asp文件上传者对此我上传按钮上的图像点击。每当我正在上传超过4 MB的图像崩溃。如果我在配置定义大小的maxRequestLength 然后,如果我超过了文件大小它再次crashes.Is可以限制用户,并显示一个免责声明邮件,如果一个巨大的文件上传。我的意图是让用户知道该文件是巨大的。在使用asp文件上传4 MB Uplaod形象?

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> 

的.cs页面事件。 protected void btnUpload_Click(object sender,EventArgs e) { try {0} {hfCurrentId.Value = 如果(fileUploader.HasFile) { 如果(fileUploader.PostedFile.ContentType.Contains( “图像”)& & fileUploader.PostedFile.ContentLength < = 3145728) {

    if (ddlImageType.SelectedValue == "1") 
        { 
         Session["FileBytes"] = fileUploader.FileBytes; 
         hfImage1Byte.Value = Convert.ToBase64String(fileUploader.FileBytes); 
         imgPreview.ImageUrl = "~/Handlers/ImageHandler.ashx?workItemId=" + workItemId 
         + "&imageTypeId=" + ddlImageType.SelectedValue; 
        } 
        else 
        { 
         Session["FileBytes2"] = fileUploader.FileBytes; 
         hfImage2Byte.Value = Convert.ToBase64String(fileUploader.FileBytes); 
         imgPreview2.ImageUrl = "~/Handlers/ImageHandler.ashx?workItemId=" + workItemId 
         + "&imageTypeId=" + ddlImageType.SelectedValue; 
        } 


       } 
       else 
       { 
        lblMessage.Text = Constants.ImageFileError; 
       } 
      } 
      else 
      { 
       lblMessage.Text = Constants.FileError; 
      } 
      //lblHeader.Text = hfCurrentId.Value; 
      //upPanel1.Update(); 
     } 
     catch (System.Exception ex) 
     { 
      //DisplayError(ex); 
      Session["ExceptionDetails"] = ex; 
      Response.Redirect(Constants.FIREErrorDetails); 
     } 
    } 

我在这里限制了由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; 
     } 

有没有其他的方式,以避免

var objFSO = new ActiveXObject("Scripting.FileSystemObject"); 

我不能使用的ActiveXObject按照某些客户问题

回答

1

简短的回答是不,你不能使用代码来捕获到大的文件,并通知用户,因为IIS设置前检查你的任何代码都会执行,因此为时已晚。

如果你想有一个更好的用户体验,那么我建议你调查类似下面的一些开源的解决方案:

  1. 定义HTTP模块

    NeatUpload是一个自由的选择。

  2. 的Silverlight /闪存选项

    SWFUpload是一个自由的选择。

  3. 异步分块选项

    RadAsyncUpload - Telerik's ASP.NET AsyncUpload是付费的选项,勾选网站的定价。

+0

我可以使用AjaxFileUploader吗? –

+0

如果您专门针对HTML5浏览器,那么是的,您可以在使用“HTML5 File API”上传文件之前获取文件大小,但是如果您有任何用户使用基于HTML4的浏览器,则会从窗口中删除。如果您阅读ASP.NET AJAX AjaxFileUploader的文档,它会说它需要HTML5来获取进度反馈;否则会显示一个微调。所以它真的归结为HTML5或不; HTML5提供了许多可能性,但要注意并非所有IE版本都支持所有的HTML5功能;请查看[我可以使用](http://caniuse.com/)网站。 –

3

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

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

<system.webServer> 
    <security> 
     <requestFiltering> 
      <requestLimits maxAllowedContentLength="YOUR_MAX_ALLOWED_SIZE IN BYTES"/> 
     </requestFiltering> 
    </security> 
</system.webServer> 

(2)确保值匹配的httpRuntime的ASP。网:

<httpRuntime executionTimeout="SECONDS" maxRequestLength="YOUR_MAX_ALLOWED_SIZE IN KB"/> 

(3)检查大小超过你的服务器端代码,并适当告知用户:

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 
} 

,除非你使用你不能在客户端检查它HTML5文件API。所以,用户必须等到整个文件上传完成后才能完成。因此,请仔细设置您的YOUR_MAX_ALLOWED_SIZE。

更新

正如你看到的,这是困难的,如果大小超过限制来抓。有几个解决方法:

  1. 设置自定义错误:

  2. 设置httpErrorssystem.webServer部分:

见马库斯接受的答案在这里:Display custom error page when file upload exceeds allowed size in ASP.NET MVC