基本的にASP.NETFileUploadコントロールがあり、次のメッセージに対してスローされた例外に対応する必要がありました。
最大リクエスト長を超えました。
制限は、他の詳細をいくつかのテキストボックスからDBに保存しているため、ユーザーが1つのファイルをアップロードするように制限する必要があることです。
最大ファイルサイズ設定は、web.configで次のように設定されます。
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="41943040" />
</requestFiltering>
</security>
</system.webServer>
<system.web>
<httpRuntime maxRequestLength="40960" requestValidationMode="2.0" />
</system.web>
したがって、私は多くの解決策を検索し、次のように名前を付けました。
「Application_BeginRequest()」でファイルサイズを検証するGlobal.asaxを使用しますが、問題が解決せず、ファイルサイズが大きく、エラーページへのリダイレクトが機能しない場合にリダイレクトでクラッシュします。
ASP.NET FileUploadコントロールの代わりにAjaxFileUploadを使用すると、ファイルサイズがWeb.configで許可されている最大サイズよりも大きいことを確認すると、これもクラッシュします。次に、ユーザーが1つのファイルをアップロードできることを制限する必要があります。AjaxFileUploadを使用すると、1つのドキュメントをアップロードして他の詳細を保存する必要があるため、この状態では機能しません。そのファイルに関連するテキストボックス。3番目に、ファイルサイズが制限(40MB)を超えると、AjaxFileUploadは赤い色になり、メッセージは表示されません。
私は数日以来これに固執しているので、どうすれば私の要件を達成できるかを知りたいです。
更新:それらのいくつかは有用であることがわかりましたが、それらに基づいて要件を達成できませんでした:
- ファイルのアップロードがASP.NETMVCで許可されているサイズを超えたときにカスタムエラーページを表示する
- 最大リクエスト長を超えました
- http://dotnetslackers.com/Community/blogs/haissam/archive/2008/09/12/upload-large-files-in-asp-net-using-httpmodule.aspx
- http://geekswithblogs.net/sglima/archive/2011/09/20/how-to-handle-maximum-request-length-exceeded-exception.aspx
- http://dotnetpools.com/Article/ArticleDetiail/?articleId=52&title=Ajax%20AsyncFileUpload%20Example%20In%20Asp.net%20To%20Upload%20Files%20To%20Server%20Using%20AjaxFileUpload%20Control
マークアップは次のとおりです。
<asp:Label ID="lblStatus" runat="server" Text=""></asp:Label>
<asp:FileUpload ID="theFile" runat="server" />
<asp:Button ID="Button2" runat="server" Text="Upload 1" onclick="Button2_Click" />
<asp:Button ID="Button1" runat="server" Text="Upload 1" onclick="btnUpload1_Click" />
<asp:Button ID="btnUpload" runat="server" Text="btnUpload_Click" onclick="btnUpload_Click" />
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:AjaxFileUpload ID="AjaxFileUpload2" runat="server" ToolTip="Upload File" ThrobberID="MyThrobber" onclientuploaderror="IsFileSizeGreaterThanMax" onuploadcomplete="AjaxFileUpload1_UploadComplete" AllowedFileTypes="jpg,jpeg,gif,png,pjpeg,zip,rar,pdf,xls,xlsx,doc,docx" MaximumNumberOfFiles="1" Height="50px" Width="350px"/>
<asp:Image id="MyThrobber" ImageUrl="~/UploadedFiles/Penguins.jpg" AlternateText="Saving...." Style="display:None" Height="1px" Width="350px" runat="server" />
以下はC#コードです。
protected void Button2_Click(object sender, EventArgs e)
{
if (theFile.HasFile)
{
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
double maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
double xxx = theFile.PostedFile.ContentLength;
double ck = xxx / 1024 / 1024;
bool f = false;
if (ck > maxRequestLength)
{
f = true;
}
lblStatus.Text = xxx.ToString() + " " + (f ? "too big" : "size ok");
}
}
protected void btnUpload1_Click(object sender, EventArgs e)
{
try
{
if ((theFile.PostedFile != null) && (theFile.PostedFile.FileName != ""))
{
if ((theFile.PostedFile != null) && (theFile.PostedFile.FileName != ""))
{
fileName = theFile.PostedFile.FileName;
Session["FileAttached"] = fileName;
}
else
{
Session["FileAttached"] = "";
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "<br/>Attachment file not found.";
return;
}
if (fileName != "")
{
cFilePath = Path.GetFileName(fileName);
/*UpPath = "../UploadedFiles";
fullPath = Server.MapPath(UpPath);
fileNpath = fullPath + "\\" + cFilePath;*/
if (theFile.HasFile)
{
string CompletePath = "D:\\Visual Studio 2010\\DevLearnings\\FileAttachSizeMax\\UploadedFiles\\";
if (theFile.PostedFile.ContentLength > 10485760)
{
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "File size is greater than the maximum limit.";
}
else
{
theFile.SaveAs(@CompletePath + theFile.FileName);
lblStatus.Text = "File Uploaded: " + theFile.FileName;
}
}
else
{
lblStatus.Text = "No File Uploaded.";
}
}
}
}
catch (Exception ex)
{
lblStatus.Focus();
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text += "Error occurred while saving Attachment.<br/><b>Error:</b> " + ex.Source.ToString() + "<br/><b>Code:</b>" + ex.Message.ToString();
}
}
protected void AjaxFileUpload1_UploadComplete(object sender, AjaxControlToolkit.AjaxFileUploadEventArgs e)
{
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
int maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
if (e.FileSize <= maxRequestLength)
{
string path = MapPath("~/UploadedFiles/");
string fileName = e.FileName;
AjaxFileUpload2.SaveAs(path + fileName);
}
else
{
lblStatus.Text = "File size exceeds the maximum limit. Please use file size not greater than 40MB. ";
return;
}
}
protected void btnUpload_Click(object sender, EventArgs e)
{
//AsyncFileUpload.SaveAs();
//AjaxFileUpload1.SaveAs();
HttpContext context = ((HttpApplication)sender).Context;
//HttpContext context2 = ((System.Web.UI.WebControls.Button)sender).Context;
HttpRuntimeSection runTime = (HttpRuntimeSection)System.Configuration.ConfigurationManager.GetSection("system.web/httpRuntime");
double maxRequestLength = (runTime.MaxRequestLength - 100) * 1024;
if (context.Request.ContentLength > maxRequestLength)
{
IServiceProvider provider = (IServiceProvider)context;
HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
FileStream fs = null;
// Check if body contains data
if (wr.HasEntityBody())
{
// get the total body length
int requestLength = wr.GetTotalEntityBodyLength();
// Get the initial bytes loaded
int initialBytes = wr.GetPreloadedEntityBody().Length;
if (!wr.IsEntireEntityBodyIsPreloaded())
{
byte[] buffer = new byte[512000];
string[] fileName = context.Request.QueryString["fileName"].Split(new char[] { '\\' });
fs = new FileStream(context.Server.MapPath("~/UploadedFiles/" + fileName[fileName.Length - 1]), FileMode.CreateNew);
// Set the received bytes to initial bytes before start reading
int receivedBytes = initialBytes;
while (requestLength - receivedBytes >= initialBytes)
{
// Read another set of bytes
initialBytes = wr.ReadEntityBody(buffer, buffer.Length);
// Write the chunks to the physical file
fs.Write(buffer, 0, buffer.Length);
// Update the received bytes
receivedBytes += initialBytes;
}
initialBytes = wr.ReadEntityBody(buffer, requestLength - receivedBytes);
}
}
fs.Flush();
fs.Close();
context.Response.Redirect("About.aspx");
}
}
上記とは別に、私は以下の解決策に到達しました。
次のコードを使用しましたが、現在はApplication_Error()コードセクションを実行していますが、問題は、About.aspxページにリダイレクトされないことです。
Hotmail.comにリダイレクトしようとしましたが、それも機能せず、例外はスローされません。
以下のコードセクションを見つけてください。
private void Application_Error(object sender, EventArgs e)
{
// Code that runs when an unhandled error occurs
Exception exc = Server.GetLastError();
try
{
if (exc.Message.Contains("Maximum request length exceeded"))
{
//Response.Redirect("~/About.aspx", false);
Response.Redirect("http://www.example.com", false);
}
if (exc.InnerException.Message.Contains("Maximum request length exceeded"))
{
Response.Redirect("http://www.HOTMAIL.com", false);
}
}
catch (Exception ex)
{
}
}