2009-03-18 13 views
6

पर प्रदर्शित होने के तुरंत बाद गतिशील रूप से जेनरेट की गई पीडीएफ फ़ाइल हटाएं I ITextSharp और ASP.NET 1.1 का उपयोग कर फ्लाई पर एक पीडीएफ फ़ाइल बना रहा हूं।उपयोगकर्ता

  • सर्वर पर फ़ाइल बनाएँ
  • पुनर्निर्देशन ब्राउज़र नव निर्मित करने के लिए PDF फ़ाइल तो यह उपयोगकर्ता

को प्रदर्शित किया जाता है मैं क्या करना चाहते हैं क्या है पीडीएफ हटाना - मेरी प्रक्रिया इस प्रकार है सर्वर से जल्द ही यह उपयोगकर्ताओं के ब्राउज़र में प्रदर्शित होता है। पीडीएफ फाइल बड़ी है इसलिए इसे स्मृति में रखने का विकल्प नहीं है, सर्वर के लिए प्रारंभिक लेखन आवश्यक है। मैं वर्तमान में एक समाधान का उपयोग कर रहा हूं जो समय-समय पर फ़ाइलों के लिए चुनाव करता है, फिर उन्हें हटा देता है, लेकिन मैं एक समाधान पसंद करूंगा जो क्लाइंट मशीन पर डाउनलोड होने के तुरंत बाद फ़ाइल को हटा देता है। क्या इसे करने का कोई तरीका है?

+0

आप की जांच कर सकता है कि इस विशिष्ट नामित पीडीएफ फाइल के लिए एक अनुरोध एक 200 कोड के साथ परोसा गया था और उस समय यह काटते ; हालांकि, आपका प्रारंभिक समाधान "पर्याप्त अच्छा" लगता है। क्या आप सलाह दे सकते हैं कि आपका वर्तमान समाधान क्यों काम नहीं कर रहा है, इसलिए हम बेहतर समाधान प्रस्तावित कर सकते हैं? –

उत्तर

6

ब्राउज़र को बनाई गई फ़ाइल में रीडायरेक्ट करने के बजाय आप स्वयं को HttpHandler का उपयोग करके फ़ाइल को स्वयं सेवा दे सकते हैं। फिर आप इसे सेवा के तुरंत बाद फ़ाइल हटा सकते हैं या आप स्मृति में फ़ाइल भी बना सकते हैं।

ग्राहक को सीधे पीडीएफ फाइल लिखें:

public class MyHandler : IHttpHandler { 
    public void ProcessRequest(System.Web.HttpContext context) { 
     context.Response.ContentType = "application/pdf"; 
     // ... 
     PdfWriter.getInstance(document, context.Response.OutputStream); 
     // ... 

या, एक पहले से ही उत्पन्न फ़ाइल 'फ़ाइल नाम' पढ़ा फ़ाइल की सेवा, इसे हटा दें:

context.Response.Buffer = false; 
context.Response.BufferOutput = false; 
context.Response.ContentType = "application/pdf"; 

Stream outstream = context.Response.OutputStream; 
FileStream instream = 
    new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read); 

byte[] buffer = new byte[BUFFER_SIZE]; 
int len; 
while ((len = instream.Read(buffer, 0, BUFFER_SIZE)) > 0) { 
    outstream.Write(buffer, 0, len); 
} 
outstream.Flush(); 
instream.Close(); 

// served the file -> now delete it 
File.Delete(filename); 

मैं कोशिश नहीं की यह कोड यह सिर्फ मैं कैसे लगता है कि यह काम करेगा है ...

5

f3lix के जवाब से प्रेरित होकर मैं folowing VB.net कोड के साथ आ गया है (धन्यवाद f3lix!) -

HttpContext.Current.Response.ClearContent() 
HttpContext.Current.Response.ClearHeaders() 
HttpContext.Current.Response.ContentType = "application/pdf" 
HttpContext.Current.Response.TransmitFile(PDFFileName) 
HttpContext.Current.Response.Flush() 
HttpContext.Current.Response.Close() 
File.Delete(PDFFileName) 

यह काम करने के लिए प्रकट होता है - 'WriteFile' विधि है जिसे मैंने कम प्रभावशाली उपयोग किया है कि f3lix द्वारा उपयोग की जाने वाली स्ट्रीम विधियां? क्या कोई तरीका उपलब्ध है जो हमारे समाधानों की तुलना में अधिक कुशल है?

EDIT (1 9/03/2009) नीचे दी गई टिप्पणियों के आधार पर मैंने 'WriteFile' विधि को 'ट्रांसमिटफाइल' में बदल दिया है क्योंकि ऐसा प्रतीत होता है कि यह फ़ाइल को वेबसर्वर की स्मृति में पूरी फ़ाइल लिखने के बजाय भाग में क्लाइंट को भेजता है भेजने से पहले। और जानकारी here मिल सकती है।

+0

आपको इसके बजाय ट्रांसमिटफाइल का उपयोग करना चाहिए। WriteFile पूरी फ़ाइल को स्मृति में लोड करता है - ट्रांसमिटफाइल इसे स्ट्रीम करता है। –

+0

इसके अलावा, प्रतिक्रिया सेटिंग।बफर = सच्चा थोडा ट्रांसमिटफाइल के खिलाफ चला जाता है, हालांकि मुझे यकीन नहीं है कि ट्रांसमिटफाइल बफर पैरामीटर को अनदेखा कर देगा या नहीं। –

0

समाधान:

Response.TransmitFile(PDFFileName) 
Response.Flush() 
Response.Close() 
File.Delete(PDFFileName) 

सीधे शब्दों में मेरे लिए काम नहीं करता है (फ़ाइल कभी नहीं ग्राहक को बनाता है)। एक बाइट सरणी में पढ़ना और Response.BinaryWrite को कॉल करना एक विकल्प नहीं है क्योंकि फ़ाइल बड़ी हो सकती है। क्या इस के लिए एकमात्र हैक एक एसिंक्रोनस प्रक्रिया शुरू करने के लिए है जो फ़ाइल को रिलीज़ करने की प्रतीक्षा करता है और फिर इसे हटा देता है?

3

या फिर आप सब पर डिस्क के लिए लिख बिना ब्राउज़र में वापस कर सकता है:

byte[] pdf; 

using (MemoryStream ms = new MemoryStream()) { 
    Document doc = new Document(); 
    PdfWriter.GetInstance(doc, ms); 
    doc.AddTitle("Document Title"); 
    doc.Open(); 
    doc.Add(new Paragraph("My paragraph.")); 
    doc.Close(); 
    pdf = ms.GetBuffer(); 
} 

Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment;filename=MyDocument.pdf"); 
Response.OutputStream.Write(pdf, 0, pdf.Length); 
संबंधित मुद्दे