2010-04-22 8 views
8

Я должен реализовать экспорт GEDCOM на моем сайте.Response.TransmitFile и удалить его после передачи

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

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

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

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

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

из этого LINK

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

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

ответ

20

Все, что вы положили после Response.End выиграли 't выполняется, потому что он бросает 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); 
} 
+1

Что такое Response.Flush и что такое Response.End? пожалуйста, сообщите мне разницу? – Radhi

+0

Response.Flush выдает любой буферный вывод (если он есть), но не бросает исключение ThreadAbortException - ответ все еще продолжается. Response.End flushes, но затем генерирует исключение ThreadAbortException, которое невозможно остановить. Ввод кода удаления в блок finally гарантирует, что он будет работать независимо от результата. – Josh

+6

Это не относится к ситуации, когда пользователь нажимает кнопку Отмена в диалоговом окне загрузки файла. Когда это происходит, HttpException генерируется с сообщением «Удаленный хост закрыл соединение. Код ошибки - 0x800703E3». то в блоке finally сбой исключается с IOException - «Процесс не может получить доступ к файлу« C: \ Windows \ TEMP \ tmp5CA3.tmp », потому что он используется другим процессом». Я добавил catch (HttpException) и вызвал Response.End() внутри catch, и это сработало для меня – Colin

2

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

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(); 
+0

Привет, это Response.TransmitFile и Response.BinaryWrite имеют никакой разницы в Performace? – Radhi

+0

@ Радхи: Не совсем. BinaryWrite быстрее, поскольку у вас уже есть данные в памяти, но вместе с загрузкой данных он делает то же самое, что и TransmitFile. – Guffa