Как определить, скачал ли файл
У меня есть следующий код, который позволяет пользователю загрузить файл. Мне нужно знать (если возможно), если они загрузили файл успешно. Есть ли какая-нибудь обратная связь, которую я могу связать, чтобы узнать, успешно ли они загрузили ее? Благодарю.
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 ответа
Почему бы не добавить еще одну строку, которая сообщает, что она закончена? После context.Response.Flush() это должно быть сделано.
Вы можете сделать что-то вроде этого:
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();
}
Я думаю, что это невозможно.
Ответ - это просто объект памяти, который взаимодействует с IIS. Вы не можете знать, загрузил ли браузер файл полностью, так как пользователь мог отменить его непосредственно перед поступлением последнего байта, но после того, как IIS завершил отправку всего потока.
Вы можете попытаться реализовать IHttpHandler, непрерывно записывать куски файла в context.Response в методе Process() и Flush() и проверять так:
context.Response.Flush();
if (!context.Response.IsClientConnected)
// handle disconnect
Это самое близкое, что я могу придумать для решения вашей проблемы.