Мне нужно добавить функцию загрузки файлов на веб-сайт ASP.NET и вы хотите прочитать небольшую часть файла на сервере, пока он все еще загружается. Функция просмотра или просмотра, чтобы я мог определить содержимое и дать некоторую обратную связь пользователю, пока он все еще загружается (мы говорим о больших файлах здесь). Есть какой-либо способ сделать это? Я думаю, худший случай написания пользовательского элемента управления, который загружает только фиксированное количество байтов файла после его выбора, а затем под обложками запускает очередную загрузку полного файла. Не совсем уверен, даже это возможно, но я все равно ищу более элегантное решение ... Спасибо!Есть ли способ «заглянуть» в файл, когда он загружается через HTTP в окно Windows?
ответ
Похоже, вы хотите избежать «белого экрана смерти» во время больших загрузок файлов. Если это так, вы можете посмотреть в Telerik's RadUpload control, который обеспечивает индикатор выполнения во время загрузки.
Если вы хотите опрокинуть свои собственные, я бы декомпилировал их пробную копию для идей. Я заглянул в их источник таким образом, и они выполняют индикатор выполнения через комбинацию пользовательского HttpModule и HttpHandler вместе с их контролем. Обработчик маршрутизирует файл потоковым способом, в то время как модуль предоставляет «процентную полную» информацию - или наоборот; Прошло несколько лет с тех пор, как я посмотрел на него.
Edit:
На самом деле, я пытаюсь сделать обработку на стороне сервера, как файл все равно загружается. Я хочу импортировать данные пользователя через HTTP, но хочу представить пользователю предварительный просмотр/параметры того, как мы будем обрабатывать их данные, пока файл все еще загружается (определения столбцов и т. Д.). Независимо от того, мы возьмем файл как есть, поэтому загрузка не должна прерываться. Учитывая, что мне действительно нужно взаимодействие во время загрузки на основе чтения относительно небольшой части файла по мере его загрузки, вы бы по-прежнему рекомендуем использовать тот же подход?
Хорошо ... это было бы очень сложно сделать, и это может не работать кросс-браузер, но это можно сделать с помощью этого подхода.
Поскольку вы можете работать с входящим файлом в качестве потока, как я уже упоминал, вы можете обновить свое начальное состояние как часть этой обработки потока. Если вы не обрабатываете поток, вам нужно дождаться полной загрузки файла, прежде чем вы сможете что-либо с ним сделать.
Проблема заключается в следующем: во время загрузки файла вы не можете больше взаимодействовать с HTML. Сообщение должно продолжаться без сохранения или загрузка не удалась. Элемент управления, с которым я связан, работает только потому, что большинство браузеров позволяют javascript продолжать выполнять и обновлять страницу DOM во время публикации.
Для выполнения этой работы вам необходимо обновить стандартизованную государственную серверную часть во время обработки файлов в HttpModule, которая передается обратно клиенту через вызовы XmlHttpRequest, обрабатываемые HttpHandler. Вы должны использовать чистый javascript/DOM для обновления пользовательского интерфейса для пользователя.
Так что, как я уже сказал, это сложный и, вероятно, глючный кросс-браузер, но теоретически это можно было бы сделать.
Есть альтернативы, которые могут быть более стабильными, но не обязательно возможны: вы можете создать элемент управления ActiveX или приложение Click-Once .NET, которое предварительно обрабатывает файл перед загрузкой и, возможно, даже асинхронно передает файл пока пользователь продолжает просмотр. Некоторым пользователям может не понравиться этот параметр, и я не знаю подробностей вашего сценария развертывания, но это вариант.
На самом деле, я пытаюсь выполнить обработку на стороне сервера, поскольку файл все еще загружается. Я хочу импортировать данные пользователя через HTTP, но хочу представить пользователю предварительный просмотр/параметры того, как мы будем обрабатывать их данные, пока файл все еще загружается (определения столбцов и т. Д.). Независимо от того, мы возьмем файл как есть, поэтому загрузка не должна прерываться. Учитывая, что мне действительно нужно взаимодействие во время загрузки на основе чтения относительно небольшой части файла по мере его загрузки, вы бы по-прежнему рекомендуем использовать тот же подход? – iisystems
@iisystems: Я обновил свой ответ в ответ на ваш коммит. – Randolpho
Определенно некоторые проблемы здесь, но это было чрезвычайно полезно. Еще раз спасибо Randolpho! – iisystems
Существует метод HTTP
HEAD
, но не PEEK
.
HEAD
предоставит вам информацию и заголовки о файле.
Конечно, вы можете сделать специальный обработчик запросов, который сделает все, что вы хотите. Вам не нужно работать со статическими ресурсами, вы можете динамически создавать любой ответ, который вы хотите.
Для других мы получили покупку стороннего решения под названием ScaleUP (у меня нет связи с компанией), который работал очень хорошо, позволяя нам написать простой фильтр, который заглядывает в поток загрузки. Это решение только для IIS7, но я настоятельно рекомендую продукт и вспомогательный персонал. – iisystems