Индикатор выполнения загрузки файла в ASP.NET 2.0

#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. Спасибо, я посмотрю на них. Я уже видел эту страницу раньше в своих поисках, но никто на самом деле не объяснил, что стандартный элемент управления загрузкой файла не позволит мне читать из входного потока, пока все это не будет получено. Итак, я попытался сделать это сам (мне нравятся сложные задачи).