#c# #asp.net #upload #progress
#c# #asp.net #загрузка #прогресс
Вопрос:
У меня есть загрузка файла на моем веб-сайте .NET. Я использовал FileUpload .Управляйте загрузкой по СЕТИ и установите для целевого объекта формы скрытый iframe. Я использую скрипт на стороне клиента для отправки формы, затем отображаю индикатор выполнения на странице, который выполняет AJAX-запрос к файлу ashx на том же сервере и обновляет индикатор выполнения каждую секунду.
Вот часть кода, указывающая, когда файл загружается —
string fileString = StringGenerator.GenerateString(8);
System.IO.Stream fileStream = System.IO.File.Create(fileRoot fileString ".mp3");
System.IO.Stream inputStream = fileUpload.PostedFile.InputStream;
byte[] buffer = new byte[256];
int read;
if(StaticProgress.Progress.ContainsKey(trackId)) StaticProgress.Progress[trackId] = 0d;
else StaticProgress.Progress.Add(trackId, 0d);
int totalRead = 0;
long length = inputStream.Length;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
totalRead = read;
fileStream.Write(buffer, 0, read);
StaticProgress.Progress[trackId] = (double)totalRead / (double)length;
}
Статический прогресс.Progress — это свойство, которое возвращает статический словарь.
Вот код в файле ashx, который отображает ход выполнения
context.Response.ContentType = "text/javascript";
int id;
if(!int.TryParse(context.Request.QueryString["id"], out id) || !StaticProgress.Progress.ContainsKey(id))
context.Response.Write("{"error":"ID not found"}");
else
context.Response.Write("{"id":"" id "","decimal":" StaticProgress.Progress[id] "}");
Здесь я всегда «идентификатор не найден» во время загрузки файла, но когда загрузка файла завершена, я получаю успешное значение — decimal: 1.
До этого я пробовал использовать переменные сеанса и получил тот же результат. Я пробовал использовать общедоступный статический (потокобезопасный?) Словарь, но я получаю тот же результат. Кто-нибудь сталкивался с чем-либо подобным раньше? Не выполняется ли код до тех пор, пока запрос клиента не будет полностью получен?
Ответ №1:
Стандартный элемент управления загрузкой файла не предоставляет возможности выполнения — он не получает файл до тех пор, пока файл не будет полностью получен сервером. К моменту открытия потока в .PostedFile файл был полностью загружен.
Существует ряд лучших решений для загрузки, обсуждаемых здесь.
Комментарии:
1. Спасибо, я посмотрю на них. Я уже видел эту страницу раньше в своих поисках, но никто на самом деле не объяснил, что стандартный элемент управления загрузкой файла не позволит мне читать из входного потока, пока все это не будет получено. Итак, я попытался сделать это сам (мне нравятся сложные задачи).