2013-07-29 33 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