2010-01-07 2 views
0

Итак, вот в чем проблема: я читаю поток из элемента управления FileUpload, считывая фрагменты из n байтов и записывая массив в цикле, пока не дойду до конца потока.Задержка операций с файлами ASP.net

Теперь причина, по которой я это делаю, заключается в том, что мне нужно проверить несколько вещей, пока загрузка все еще продолжается (вместо того, чтобы делать Save(), что делает все это за один раз). Вот в чем проблема: при выполнении этого с локальной машины я могу видеть файл просто прекрасным, поскольку он загружается и его размер увеличивается (должен был добавить предложение Sleep() в цикле, чтобы фактически увидеть, как файл записывается).

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

Есть ли какой-либо параметр безопасности в (или ASP.net), который может сохранять файлы во временном месте для удаленных компьютеров, а не на локальном компьютере, а затем перемещает их в указанный пункт назначения? Я бы упомянул об этом, когда ASP.net отображал сообщения об ошибках при просмотре с локального компьютера (даже на общедоступном имени хоста), в отличие от общей страницы исключений ошибок/общего исключения, которая отображается при просмотре с удаленной машины (а customErrors - нет off)

Любые подсказки по этому вопросу?

Заранее благодарен.

ответ

0

FileUpload элемент управления в качестве элемента HTML <input type="file">; таким образом, ваш браузер откроет этот файл, прочитает ВСЕ содержимое, закодирует и отправит его.

Ваш запрос ASP.NET начинается только после того, как IIS получает все данные браузера.

Таким образом, вам необходимо закодировать клиентский компонент (Flash, Java-апплет, Silverlight), чтобы отправить файл небольшими фрагментами и перестроить его на стороне сервера.

EDIT: Некоторая информация on MSDN:

Контролировать ли файл для загрузки временно хранится в памяти или на сервере, пока запрос обрабатывается, установите атрибут requestLengthDiskThreshold элемента httpRuntime. Этот атрибут позволяет вам управлять размером буфера входного потока. Значение по умолчанию - 256 байт. Указанное значение не должно превышать значение, указанное вами для атрибута maxRequestLength.

+0

Итак, что вы говорите, так это то, что даже с задержкой, которая была у меня на локальном компьютерном тесте, содержимое уже достигло IIS целиком, и я только что обработал внутреннее то, что уже пришло. В основном, что я пытаюсь сделать, это индикатор прогресса загрузки на сервере/стороне клиента (который будет опросить другую страницу на сервере для прогресса с помощью javascript на стороне клиента). Спасибо. Кроме того, если значение по умолчанию уже 256 байтов (и мы предполагаем, что каждый раз, когда каждые 256 байтов записываются на диск), это означает, что это не сработает :( Спасибо за ответ. – mtranda

+0

Если честно, я не понял, что свойство 'requestLengthDiskThreshold' тоже, но для того, чтобы создать процесс загрузки, вы должны отправить данные в виде фрагментов. –

+0

Что особенно заинтриговало меня и определило, что я пытаюсь использовать веб-метод, это библиотека jQuery. http: //t.wits .sg/misc/jQueryProgressBar/demo.php Я пытаюсь загрузить, когда мы говорим, и, похоже, работает для PHP. – mtranda

0

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

+0

Основная проблема заключается в том, что триггер не активируется до тех пор, пока не будет отправлено все содержимое запроса (в данном конкретном случае весь fi ле). То, что я пытался сделать, это доступ к данным файла, поскольку он все еще загружался на сервер. – mtranda

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