AjaxFileUpload перезагружает страницу при загрузке ТОЛЬКО для файлов изображений

#asp.net #vb.net #ajaxcontroltoolkit

Вопрос:

Я работал над отладкой периодически возникающей проблемы, с которой я сталкивался с AjaxFileUpload. Я удаляю наш код от другого загрузчика и уже обработал его на нескольких страницах. Я понял, что загрузчик перезагружает страницу после завершения полного кода загрузки в коде ТОЛЬКО для изображений. Я могу загрузить .pdf, .docx абсолютно без проблем, но как только я попробую .png, .jpeg, .gif и т. Д., Страница перезагрузится сразу после загрузки.

Я не могу найти ничего, что указывало бы на то, что поведение между этими двумя типами файлов должно отличаться, и я предполагаю, что что-то упускаю.

Вот мой контроль загрузки:

 lt;ajax:AjaxFileUpload AutoStartUpload="true" OnClientUploadCompleteAll="() =gt; $('#btnSaveThumbnails').toggle()" ClientIDMode="Static" style="max-width:800px;display:none" runat="server" ID="thumbUploader" /gt;  

А вот код для функции UploadComplete:

 If Not System.IO.Directory.Exists(tempFilePath) Then  System.IO.Directory.CreateDirectory(tempFilePath)  End If   sender.SaveAs(tempFilePath amp; e.FileName)   Session("docUploaderFiles") = If(Session("docUploaderFiles"), New List(Of String))  CType(Session("docUploaderFiles"), List(Of String)).Add(e.FileName)  

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

ОБНОВЛЕНИЕ: я сузил его до того, что он вызван вызовом .SaveAs в коде. Удаление только этой строки не приводит к перезагрузке страницы.

ОБНОВЛЕНИЕ: Я обнаружил, что эта проблема характерна для моей машины. Загрузчик работает в других локальных средах, а также в нашем производственном приложении. Возможно, это как-то связано с моим IIS.

Комментарии:

1. Вы используете щелчок/переключение кнопки, когда событие «все готово» с вашими btnSaveThumbs, и я подозреваю, что это приводит к окончательному возврату, когда ВСЕ файлы будут готовы. таким образом, похоже, что ваше последнее событие «все» выполняет обратную отправку (и это часто необходимо). Таким образом, из того, что я могу видеть до сих пор, событие выгрузки каждого файла не вызывает обратной передачи, но конечное событие выгрузки «все» выполнено (и, как я отметил, это обычная настройка). Итак, я бы проверил код события «Все сделано», поскольку он выглядит как источник обратной записи. Таким образом, каждое событие файла срабатывает, а затем окончательное «все событие» срабатывает для конечного события, и обратная запись не должна иметь значения

2. @AlbertD.Kallal На самом деле это вызывает полную загрузку страницы, а не обратную передачу, как подтверждено некоторыми точками останова в моей отладке. Большая загадка для меня заключается в том, что такое поведение НЕ СУЩЕСТВУЕТ для .doc,. pdf,. xlsx (и я уверен, что другие расширения), а только для файлов изображений (.png,. jpeg,. gif протестировано).

3. поместите png, jpeg и т.д. В допустимые типы файлов. Возможно, ошибка страницы/сценария? Согласитесь, что это не имеет смысла. Вы показываете ноготь большого пальца или что-то еще об этом файле после загрузки? Или просто файл загружен? Я часто использую этот элемент управления — даже изменил его, чтобы разрешить передачу значений для каждого события (поэтому мне не нужно использовать сеанс). Итак, у вас есть специальный код для финального события «все»?

4. Спасибо вам за ваш ответ. Я пробовал допустимые типы файлов без успеха ранее и снова только сейчас для хорошей меры. Ничего не вижу в своей консоли JS. Я больше ничего не делаю с изображением на странице. Не существует внешних или внутренних событий «все». Я также использую эту же реализацию на нескольких страницах, которые имеют одинаковый опыт.

5. Я бы открыл тестовую страницу и запустил загрузчик файлов. Если необходимо, жестко закодируйте имя файла «Сохранить как», но попробуйте проверить страницу и посмотрите, произойдет ли это. Помните, что если в каком — либо из 3 событий на стороне сервера произошла ошибка, то это также может быть проблемой. Итак, я бы создал быструю тестовую страницу — посмотрим, сработает ли это. Я сам попробую создать тестовую страницу, так как я загружаю только файлы pdf и zip. Но я не могу себе представить, почему png/jpeg может быть проблемой? Возможно, у вас есть пользовательский обработчик http для файлов jpeg на этом сайте, но даже в этом случае это не должно иметь значения.

Ответ №1:

Я не понимаю, почему это не сработает.

Тем не менее, я ЧАСТО обнаруживал, что если вы не укажете и не свяжете события на стороне КЛИЕНТА, то загрузчик может блевать на вас.

Итак, попробуйте это для вашего теста:

 lt;ajaxToolkit:AjaxFileUpload ID="AjaxFileUpload1" runat="server"   OnClientUploadComplete="MyComplete"   OnClientUploadCompleteAll="MyCompleteAll"   OnClientUploadStart="MyStart" AllowedFileTypes="txt,zip,png,jpeg"  OnClientUploadError="MyError" ChunkSize="16384" /gt;   lt;/divgt;  lt;br /gt;  lt;br /gt;  lt;/divgt;   lt;scriptgt;   function MyStart() {   }   function MyComplete() {   }   function MyCompleteAll() {   }   function MyError(e) {  }    lt;/scriptgt;  

Обратите внимание, как я добавил события на стороне клиента. Я обнаружил, что в некоторых случаях без событий на стороне клиента возникают проблемы, поэтому я опускаю 4 пустых события на стороне клиента.

ДАЖЕ если вы не используете события на стороне клиента, попробуйте поместить их в соответствии с приведенным выше. Итак, я включил 4 события на стороне клиента — без какого-либо кода в этих заглушках.

Мой код на стороне сервера для этого теста выглядит так:

 Protected Sub AjaxFileUpload1_UploadCompleteAll(sender As Object, e As AjaxControlToolkit.AjaxFileUploadCompleteAllEventArgs) Handles AjaxFileUpload1.UploadCompleteAll   Debug.Print("all done")  End Sub  Protected Sub AjaxFileUpload1_UploadStart(sender As Object, e As AjaxControlToolkit.AjaxFileUploadStartEventArgs) Handles AjaxFileUpload1.UploadStart   Debug.Print("start upload")  End Sub  Protected Sub AjaxFileUpload1_UploadComplete(sender As Object, e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete   Debug.Print("file done")   Debug.Print(e.FileName)  End Sub  Protected Sub AsyncFileUpload1_UploadedFileError(sender As Object, e As AjaxControlToolkit.AsyncFileUploadEventArgs)   Debug.Print(e.StatusMessage)   End Sub  

Я бы также поставил галочку убрал символы, отличные от ASCII, в имени файла. Я видел забавные файлы — и они выдают ошибку.

Итак, я делаю это:

 Dim strCleanFile As String = TrimNonAscii(e.FileName)  

и

 Public Function TrimNonAscii(ByVal value As String) As String   Dim pattern As String = "[^ -~] "  Dim reg_exp As Regex = New Regex(pattern)  Return reg_exp.Replace(value, "")  End Function  

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

Комментарии:

1. Используя точный код, который вы предоставили, у меня не было перезагрузки страницы. Это заставило меня попробовать мои оригинальные загрузчики без кода на стороне сервера, который также работал. Это наводит меня на мысль, что проблема вызвана кодом на стороне сервера, но все это довольно прямолинейно, и я не могу представить, почему изображения будут действовать иначе, чем другие типы файлов.

2. Если код на стороне сервера выдает ошибку, то все рушится. Возможно, тестовый файл открыт/заблокирован/не перезапущен. Попробуйте другой файл png. У меня есть код на стороне сервера, указанный выше, и я опубликую свой код на стороне сервера.

3. Я пришел к выводу, что это отправитель. Вызов SaveAs (), который вызывает перезагрузку страницы. Однако это не приводит к каким-либо ошибкам. И еще одно замечание заключается в том, что вызов SaveAs() фактически сохраняет изображение.

4. Попробуйте использовать 4 заглушки кода на стороне сервера. И убедитесь, что существуют 4 заглушки на стороне клиента. Если все события срабатывают, значит, у вас произошла какая — то ошибка на стороне сервера-либо имя пути, либо какой-то заблокированный файл. Сбросьте код сохранения файла на тестовой странице — убедитесь, что все события срабатывают. Как уже отмечалось, прошло некоторое время, но я, кажется, припоминаю, что если все 4 заглушки js клиентских событий не существуют, то возникают проблемы — поэтому я вставляю их, даже когда они не нужны и не используются. Также проверьте t

5. Не используйте отправителя. Используйте AjaxFileUpload1.SaveAs()