Response.TransmitFile и удалите его после передачи - PullRequest
8 голосов
/ 22 апреля 2010

Мне нужно реализовать экспорт GEDCOM на моем сайте.

Мой код .net создал один файл на сервере при экспорте в gedcom.

Затем мне нужно загрузить его на клиент с сервера, а также спросить у пользователя, где сохранить этот файл, то есть требуется saveialog.

После загрузки я хочу удалить этот файл с сервера.

Я получил один код для передачи файла с сервера на клиент:

Response.ContentType = "text/xml";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
Response.TransmitFile(Server.MapPath("~/" + FileName));
Response.End();

из этого ССЫЛКА

но я не могу удалить файл после этого кода, так как Response.End завершает ответ, поэтому любой код, написанный после этой строки, не выполняется

Если я делаю код для удаления файла до Response.End();, то файл не передается, и я получаю ошибку.

Ответы [ 2 ]

23 голосов
/ 22 апреля 2010

Все, что вы поместите после Response.End, не будет выполнено, потому что оно генерирует исключение ThreadAbortException, чтобы остановить выполнение страницы в этот момент.

Попробуйте вместо этого:

string responseFile = Server.MapPath("~/" + FileName);

try{
    Response.ContentType = "text/xml";
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
    Response.TransmitFile(responseFile);
    Response.Flush();
}
finally {
    File.Delete(responseFile);
}
2 голосов
/ 22 апреля 2010

Если файл достаточно мал, вы можете загрузить его в байтовый массив, чтобы вы могли удалить файл, сохраняя возможность отправки данных:

Response.ContentType = "text/xml";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
string path = Server.MapPath("~/" + FileName);
byte[] data = File.ReadAllBytes(path);
File.Delete(path);
Response.BinaryWrite(data);
Response.End();
...