使用asp文件上传器上传超过4mb的图片
本文关键字:4mb asp 文件 使用 | 更新日期: 2023-09-27 18:25:17
我使用的是一个asp文件上传器,通过它我可以点击按钮上传图像。每当我上传的图像超过4mb时,它就会崩溃。如果我在配置中定义了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(对象发件人,EventArgs e){尝试{//hfCurrentId.Value="工作项id:"+hfWorkItemID.Value;if(fileUploader.HasFile){if(fileUploader.PostedFile.ContentType.Contains("image")&;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。
假设您没有使用HTML5。假设您没有按照Karl的建议使用自定义/第三方组件。
(1) 您需要首先在web.config中限制IIS的上载大小:
<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文件API,否则您无法在客户端检查它。因此,用户必须等到整个文件上传完毕,然后才能达到最大值。因此,请仔细设置your_MAX_ALLOWED_SIZE。
更新:
正如你所看到的,如果尺寸超过限制,就很难抓住。有几个解决办法:
设置自定义错误:
在
system.webServer
部分设置httpErrors
:
在此处查看Marcus接受的答案:当文件上传超过ASP.NET MVC 中允许的大小时显示自定义错误页面
简单的答案是否定的。您不能使用代码捕获过大的文件并通知用户,因为在执行任何代码之前都会检查IIS设置,因此为时已晚。
如果你想要更好的用户体验,那么我建议你研究一些开源解决方案,如以下:
-
自定义HTTP模块
NeatUpload是一个免费选项。
-
Silverlight/Flash选项
SW上载是一个免费选项。
-
异步分块选项
RadAsyncUpload-Telerik的ASP.NET异步上传是一个付费选项,请查看网站的定价。