как определить, скачал ли файл - PullRequest
2 голосов
/ 06 октября 2009

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

string filename = Path.GetFileName(url);
context.Response.Buffer = true;
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = "application/x-rar-compressed";
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
context.Response.TransmitFile(context.Server.MapPath(url));
context.Response.Flush();

Ответы [ 3 ]

4 голосов
/ 06 октября 2009

Почему бы не добавить еще одну строку, которая сообщит, что она закончена? После context.Response.Flush () это должно быть сделано.

2 голосов
/ 06 октября 2009

Вы можете сделать что-то вроде этого:


try
{
    Response.Buffer = false;
    Response.AppendHeader("Content-Disposition", "attachment;filename=" + file.Name);
    Response.AppendHeader("Content-Type", "application/octet-stream");
    Response.AppendHeader("Content-Length", file.Length.ToString());

    int offset = 0;
    byte[] buffer = new byte[64 * 1024]; // 64k chunks
    while (Response.IsClientConnected && offset < file.Length)
    {
        int readCount = file.GetBytes(buffer, offset,
            (int)Math.Min(file.Length - offset, buffer.Length));
        Response.OutputStream.Write(buffer, 0, readCount);
        offset += readCount;
    }

    if(!Response.IsClientConnected)
    {
        // Cancelled by user; do something
    }
}
catch (Exception e)
{
    throw new HttpException(500, e.Message, e);
}
finally
{
    file.Close();
}
0 голосов
/ 06 октября 2009

Полагаю, это невозможно.

Ответ - это просто объект памяти, который взаимодействует с IIS. Вы не можете знать, загрузил ли браузер файл полностью, поскольку пользователь мог отменить его непосредственно перед поступлением последнего байта, но после того, как IIS завершил отправку всего потока.

Вы можете попытаться реализовать IHttpHandler, непрерывно записывать куски файла в context.Response в методе Process () и Flush () и проверять вот так

context.Response.Flush();
if (!context.Response.IsClientConnected)
// handle disconnect

Это самое близкое, что я могу придумать для решения вашей проблемы.

...