2010-04-22 11 views
8

मुझे अपनी साइट में GEDCOM निर्यात को लागू करना होगा।Response.TransmitFile और ट्रांसमिशन के बाद इसे हटाएं

मेरे .NET कोड ने सर्वर पर एक फ़ाइल बनाई जब gedcom पर क्लिक किया गया।

फिर मुझे इसे सर्वर से क्लाइंट में डाउनलोड करने की आवश्यकता है, साथ ही उपयोगकर्ता से पूछा जाना चाहिए कि उस फ़ाइल को कहां से सहेजना है, जिसका अर्थ है सहेजे गए हैं।

डाउनलोड होने के बाद, मैं उस फ़ाइल को सर्वर से हटाना चाहता हूं।

मैं ग्राहक के लिए सर्वर से फ़ाइल संचारित करने के लिए एक कोड मिला: इस LINK

से

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

लेकिन मैं Response.End के रूप में इस कोड के बाद फ़ाइल को नष्ट कर पा रहा हूँ प्रतिक्रिया इतनी जो कुछ कोड लिखा समाप्त होता है उस पंक्ति के बाद निष्पादित नहीं है।

यदि मैं Response.End(); से पहले फ़ाइल को हटाने के लिए कोड करता हूं, तो फ़ाइल प्रेषित नहीं होती है और मुझे कोई त्रुटि मिलती है।

उत्तर

20

कुछ भी आप डाल के बाद 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); 
} 
+1

क्या प्रतिक्रिया। फ्लश करता है और क्या प्रतिक्रिया। अंत करता है ?? कृपया मुझे अंतर बता सकते हैं? – Radhi

+0

Response.Flush किसी भी buffered आउटपुट (अगर कोई है) बाहर मजबूर करता है लेकिन ThreadAbortException फेंक नहीं देता है - प्रतिक्रिया अभी भी प्रगति पर है। Response.End flushes लेकिन फिर एक ThreadAbortException फेंकता है जिसे रोका नहीं जा सकता है। अंत में ब्लॉक में डिलीट कोड डालने से यह सुनिश्चित होता है कि इससे कोई फर्क नहीं पड़ता कि इससे कोई फर्क नहीं पड़ता। – Josh

+6

यह उपयोगकर्ता द्वारा फ़ाइल डाउनलोड संवाद में रद्द होने पर स्थिति को संभाल नहीं करता है। जब ऐसा होता है तो संदेश के साथ एक HttpException फेंक दिया जाता है "रिमोट होस्ट ने कनेक्शन बंद कर दिया। त्रुटि कोड 0x800703E3 है।" फिर अंत में ब्लॉक को हटाएं IOException के साथ विफल रहता है - "प्रक्रिया फ़ाइल 'C: \ Windows \ TEMP \ tmp5CA3.tmp' तक नहीं पहुंच सकती है क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।" मैंने पकड़ के अंदर एक पकड़ (एचटीपीएक्सप्शन) जोड़ा और Response.End() कहा और यह मेरे लिए काम किया – 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

@ राधी: वास्तव में नहीं। बाइनरीवाइट निश्चित रूप से तेज़ है क्योंकि आपके पास पहले से ही स्मृति में डेटा है, लेकिन डेटा लोड करने के साथ यह ट्रांसमिटफाइल जैसा ही काम करता है। – Guffa

संबंधित मुद्दे