2013-09-09 2 views
2

Я пытаюсь ограничить, насколько большой файл может загрузить пользователь на определенной странице. Я сделал это с помощью web.config вроде этого:Как отображать предупреждение Javascript вместо ошибки на желтой странице

<location path="SubSection/TestPage"> 
    <system.web> 
     <httpRuntime maxRequestLength="2048" /> 
    </system.web> 
</location> 

Однако, когда эти ошибки, она берет пользователя к одной из этих страниц желто-ошибок ASP.NET. Теперь я знаю, что можно создавать собственные страницы ошибок, и я изучил это, но они все еще требуют перенаправления браузера.

Это просто для того, чтобы попытаться проинформировать пользователя о том, что они пытаются загрузить слишком большой файл, не перемещая их с той страницы, в которой они сейчас находятся. Возможно ли предотвратить перенаправление этого TestPage на страницу с желтой ошибкой и вместо этого отобразить всплывающее окно JavaScript?

Я попытался обработать ошибку в методе Application_Error() в файле global.asax, но, к сожалению, он всегда перенаправляется после завершения этого метода, независимо от того, что я делаю в нем. Мои попытки отобразить всплывающее окно JavaScript на этой странице также не были успешными, хотя я понимаю, что это действительно возможно в файле global.asax, поэтому я бы предположил, что я просто делаю что-то не так.

Это мой код для обработки Application_Error(), основанный на принятом ответе от here, с частью JavaScript на основе this.

void Application_Error(object sender, EventArgs e) 
{ 
    int TimedOutExceptionCode = -2147467259; 
    Exception mainEx; 
    Exception lastEx = Server.GetLastError(); 
    HttpUnhandledException unhandledEx = lastEx as HttpUnhandledException; 

    if (unhandledEx != null && unhandledEx.ErrorCode == TimedOutExceptionCode) 
    { 
     mainEx = unhandledEx.InnerException; 
    } 
    else 
     mainEx = lastEx; 

    HttpException httpEx = mainEx as HttpException; 

    if (httpEx != null && httpEx.ErrorCode == TimedOutExceptionCode) 
    { 
     if(httpEx.StackTrace.Contains("GetEntireRawContent")) 
     { 
      System.Web.UI.Page myPage = (System.Web.UI.Page)HttpContext.Current.Handler; 
      myPage.RegisterStartupScript("alert","<script language=javascript>alert('The file you attempted to upload was too large. Please try another.');</script" + ">"); 
      Server.ClearError(); 
     } 
    } 
} 

Наконец, я также попытался следующий код в самом пользовательском элементе управления (который находится в VB.NET), на основе принятого ответа от this:

Private Sub Page_Error(ByVal sender As Object, ByVal e As EventArgs) 
     Dim err As Exception = Server.GetLastError() 
     Dim cs As ClientScriptManager = Page.ClientScript 
     If (cs.IsStartupScriptRegistered(Me.GetType(), "testJS") = False) 
      Dim cstext1 As String = "alert('" & err.Message & "');" 
      cs.RegisterStartupScript(Me.GetType(), "testJS", cstext1, True) 
     End If 
    End Sub 

К сожалению, этот код не кажется, чтобы вообще вызвали.

Чтобы повторить, это просто для обработки, скажем, простой ошибки пользователя при загрузке слишком маленького файла. Я не хочу перенаправлять и потерять то, что еще пользователь мог сделать на исходной странице, я просто хочу отобразить простое окно предупреждения JavaScript. Это можно сделать?

+0

вам просто нужно проверить размер файла .. Если он превышает этот размер, вам следует показать сообщение с предупреждением, которое довольно просто .. –

ответ

0

Вы можете получить размер файла в java-скрипте, как показано ниже.

var fileSize = document.getElementById("myfileUploader").files[0].size; //gives size in bytes. 

if(fileSize > 2097152) //2038Kb = 2038*1024 bytes 
{ 
alert("File size exceded"); 
return false; 
} 
+1

Это не будет работать на IE. Кроме того, вы проверяете 2048 BYTES (как указано в комментарии), но конфиг, показанный OP, основан на ** Kb **, поэтому вместо него должно быть 'fileSize> 2097152'. – freefaller

+0

С положительной стороны, Я не знал об этой способности в браузерах, отличных от IE, поэтому спасибо за это :-) – freefaller

+0

Для этого JavaScript-решения требуется, чтобы файл, выбранный пользователем, завершил загрузку сначала, не так ли? Если это так, это будет означать, что он достигнет предела «maxRequestLength» до того, как он ударит по JavaScript, не так ли? – Interminable

0

Вы можете отправить запрос с помощью AJAX и обработать ответ об ошибке как указание на то, что файлы слишком велики. Например, с помощью JQuery:

$.ajax("/my/upload/action", 
    { 
     type: "POST", 
     data-type: "xml", 
     data: serializeFilesAsXML(); 
     success: function() { 
      alert("Your files were uploaded!"); 
     } 
     error: function(jqXHR, textStatus, errorThrown) { 
      if(errorThrown == "Files Too Large") { 
       alert("Your files were too large."); 
      } else { 
       alert("There was an error uploading your files. Please try again."); 
      } 
     } 
    } 
); 

Вы, возможно, придется переписать свои действия для загрузки файлов, таким образом, что он реагирует на AJAX запросов и может посылать соответствующие сообщения об ошибках.

Смежные вопросы