我正在使用一个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>
<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) { 尝试 { //hfCurrentId.Value =“工作项ID:”+ hfWorkItemID.Value; if(fileUploader.HasFile) { if(fileUploader.PostedFile.ContentType.Contains(“image”)&amp;&amp; fileUploader.PostedFile.ContentLength&lt; = 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
答案 0 :(得分:3)
假设您没有使用HTML5。假设您没有按照Karl的建议使用自定义/第三方组件。
(1)您需要首先在IIS的web.config中限制上传大小:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="YOUR_MAX_ALLOWED_SIZE IN BYTES"/>
</requestFiltering>
</security>
</system.webServer>
(2)确保ASP.Net的httpRuntime中的值匹配:
<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 File API,否则无法在客户端进行检查。因此,用户必须等到整个文件上传,然后才能最大化。因此,请仔细设置您的YOUR_MAX_ALLOWED_SIZE。
<强>更新强>:
如您所见,如果尺寸超出限制,很难捕捉到。有一些解决方法:
设置自定义错误:
在httpErrors
部分设置system.webServer
:
请参阅Marcus接受的答案:Display custom error page when file upload exceeds allowed size in ASP.NET MVC
答案 1 :(得分:1)
简短的回答是,你不能使用代码来捕获大量文件并通知用户,因为在你的任何代码执行之前检查了IIS设置,因此为时已晚。
如果您想获得更好的用户体验,我建议您调查一些开源解决方案,如下所示:
自定义HTTP模块
NeatUpload是免费选项。
Silverlight / Flash选项
SWFUpload是免费选项。
异步分块选项
RadAsyncUpload - Telerik's ASP.NET AsyncUpload是付费选项,请查看网站以了解定价。