Как определить, когда загрузка файла завершилась в ASP.NET?

У меня есть всплывающее окно, в котором отображается "Подождите, пока ваш файл будет загружен". Это всплывающее окно также выполняет приведенный ниже код, чтобы начать загрузку файла. Как закрыть всплывающее окно после завершения загрузки файла? Мне нужно каким-то образом обнаружить, что загрузка файла завершена, поэтому я могу вызвать self.close(), чтобы закрыть это всплывающее окно.

System.Web.HttpContext.Current.Response.ClearContent();
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ClearHeaders();
System.Web.HttpContext.Current.Response.ContentType = fileObject.ContentType;
System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Concat("attachment; filename=", fileObject.FileName));
System.Web.HttpContext.Current.Response.WriteFile(fileObject.FilePath);
Response.Flush();
Response.End();

Ответ 1

Идея:

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

Response.ContentType = "application/octet-stream";
Response.AppendHeader("content-disposition", "attachment; filename=bob.mp3");
Response.AppendHeader("content-length", "123456789");

Убедитесь, что вы проверяете Response.IsClientConnected при записи в поток ответов.

Ответ 2

Существует решение, в котором вы можете отслеживать статус загрузки, передавая файл как меньшие пакеты и проверяя, были ли все пакеты переданы. Решение не мое, но вы можете найти его здесь: Загрузка файла в ASP.NET и отслеживание состояния успеха/сбоя загрузки

//Function for File Download in ASP.Net in C# and 
//Tracking the status of success/failure of Download.
private bool DownloadableProduct_Tracking()
{
//File Path and File Name
string filePath = Server.MapPath("~/ApplicationData/DownloadableProducts");
string _DownloadableProductFileName = "DownloadableProduct_FileName.pdf";

System.IO.FileInfo FileName = new System.IO.FileInfo(filePath + "\\" + _DownloadableProductFileName);
FileStream myFile = new FileStream(filePath + "\\" + _DownloadableProductFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

//Reads file as binary values
BinaryReader _BinaryReader = new BinaryReader(myFile);

//Ckeck whether user is eligible to download the file
if (IsEligibleUser())
{
//Check whether file exists in specified location
if (FileName.Exists)
{
    try
    {
    long startBytes = 0;
    string lastUpdateTiemStamp = File.GetLastWriteTimeUtc(filePath).ToString("r");
    string _EncodedData = HttpUtility.UrlEncode(_DownloadableProductFileName, Encoding.UTF8) + lastUpdateTiemStamp;

    Response.Clear();
    Response.Buffer = false;
    Response.AddHeader("Accept-Ranges", "bytes");
    Response.AppendHeader("ETag", "\"" + _EncodedData + "\"");
    Response.AppendHeader("Last-Modified", lastUpdateTiemStamp);
    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName.Name);
    Response.AddHeader("Content-Length", (FileName.Length - startBytes).ToString());
    Response.AddHeader("Connection", "Keep-Alive");
    Response.ContentEncoding = Encoding.UTF8;

    //Send data
    _BinaryReader.BaseStream.Seek(startBytes, SeekOrigin.Begin);

    //Dividing the data in 1024 bytes package
    int maxCount = (int)Math.Ceiling((FileName.Length - startBytes + 0.0) / 1024);

    //Download in block of 1024 bytes
    int i;
    for (i = 0; i < maxCount && Response.IsClientConnected; i++)
    {
        Response.BinaryWrite(_BinaryReader.ReadBytes(1024));
        Response.Flush();
    }
    //if blocks transfered not equals total number of blocks
    if (i < maxCount)
        return false;
    return true;
    }
    catch
    {
    return false;
    }
    finally
    {
    Response.End();
    _BinaryReader.Close();
    myFile.Close();
    }
}
else System.Web.UI.ScriptManager.RegisterStartupScript(this, GetType(),
    "FileNotFoundWarning","alert('File is not available now!')", true);
}
else
{
System.Web.UI.ScriptManager.RegisterStartupScript(this, GetType(), 
    "NotEligibleWarning", "alert('Sorry! File is not available for you')", true);
}
return false;
}

Ответ 3

Некоторые хаки вокруг этого связаны с пониманием того, когда был отправлен последний кусок буфера или проверка свойства HttpResponse.IsClientConnected.

Ответ 4

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

  • Создайте скрытый элемент DIV с помощью сообщение "Файл загружается..." а не всплывающее окно.
  • Показать div при загрузке начинается
  • Как только какой-либо другой элемент на формы нажата, скрыть div снова..
  • Вы также можете установить таймер, чтобы скрыть после этого загрузите сообщение div количество времени...

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

Ответ 5

Способ сделать это в вашем всплывающем меню, чтобы вызвать сервер через опрос AJAX для ответа, который указывает, что файл был сброшен.

Пример: перед отправкой файла сохраните sessionID + имя_файла в БД или сеансе или что у вас есть.

На клиенте, в вашем всплывающем окне, опросите веб-сервис через AJAX - это может быть даже WebMethod, например Bool IsContentFlushed(string sessionID, string fileName);

После выполнения Response.Flush(); удалите этот sessionID + имя_файла из своего хранилища.

Вызовите Response.Close() вместо Response.End() - более поздняя версия является очень жестокой и обычно перегружается.