2013-03-08 8 views
11

के स्ट्रीमकंटेंट के रूप में भेजे गए फ़ाइल को कैसे हटाएं ASP.NET वेबपी में, मैं क्लाइंट को एक अस्थायी फ़ाइल भेजता हूं। मैं फ़ाइल पढ़ने के लिए एक स्ट्रीम खोलता हूं और HttpResponseMessage पर StreamContent का उपयोग करता हूं। एक बार क्लाइंट फ़ाइल प्राप्त करने के बाद, मैं इस अस्थायी फ़ाइल को हटा देना चाहता हूं (क्लाइंट से किसी अन्य कॉल के बिना) क्लाइंट फ़ाइल प्राप्त करने के बाद, HttpResponseMessage की डिस्प्ले विधि को & कहा जाता है, स्ट्रीम भी डिस्पोजेड किया जाता है। अब, मैं इस बिंदु पर अस्थायी फ़ाइल को भी हटाना चाहता हूं।HttpResponseMessage

एक तरह से यह करने के लिए, HttpResponseMessage वर्ग से एक वर्ग निकाले जाते निपटान विधि ओवरराइड, इस फाइल & कॉल आधार वर्ग के निपटाने पद्धति को हटाना है। (मैंने अभी तक यह कोशिश नहीं की है, इसलिए यह सुनिश्चित न करें कि यह निश्चित रूप से काम करता है)

मैं जानना चाहता हूं कि इसे प्राप्त करने का कोई बेहतर तरीका है या नहीं।

+1

ऊपर दृष्टिकोण काम करने के लिए लगता है, लेकिन सामग्री से पहले फ़ाइल हटा दी जाती है निपटारा करने के लिए (के रूप में फाइल करने के लिए धारा अभी भी खुला है) की जरूरत है 'संरक्षित ओवरराइड शून्य निपटान (निपटाने bool) { सामग्री। निपटान(); FileInfo फ़ाइल = नया FileInfo (_localFile); फ़ाइल। हटाएं(); आधार। निपटान (निपटान); } ' –

उत्तर

13

असल your comment प्रश्न का समाधान में मदद की ... मैं इसके बारे में यहां लिखा है:

Delete temporary file sent through a StreamContent in ASP.NET Web API HttpResponseMessage

यहाँ क्या मेरे लिए काम किया है। ध्यान दें कि Dispose अंदर कॉल के आदेश अपनी टिप्पणी से अलग है:

public class FileHttpResponseMessage : HttpResponseMessage 
{ 
    private string filePath; 

    public FileHttpResponseMessage(string filePath) 
    { 
     this.filePath = filePath; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 

     Content.Dispose(); 

     File.Delete(filePath); 
    } 
} 
+2

बस जोड़ने के लिए, इस उत्तर के एक महीने बाद भी यही प्रश्न पूछा गया है, [यहां] (http://stackoverflow.com/questions/20137283/web-api-how-to-detect-when-a- प्रतिक्रिया-समाप्त हो रही है), और यह इस तरह के समान है। लेकिन 'HttpResponseMessage' subclassing के बजाय, यह 'StreamContent' के साथ ऐसा करते हैं। मुझे इस तरह से नौकरी करने में अधिक सहज महसूस होता है क्योंकि यह प्रश्न में समस्या (निकट व्यवहार को ओवरराइड करना) के करीब है, 'सामग्री को स्पष्ट कॉल से बचें।) ( – Chopin

+0

इस तरह के दृष्टिकोणों से बहुत सावधान रहें। 'निपटान (बूल)' विधि का अर्थ 'निपटान()' और अंतिमकर्ताओं से किया जाना है। और फाइनलरों को कभी फेंकना नहीं चाहिए। तो आप शायद 'डिस्पोजेइंग' का परीक्षण करना चाहते हैं, और 'डिस्पोजेइंग' सत्य होने पर केवल 'फ़ाइल। हटाएं' को कॉल करें। –

3

मैं एक बाइट [] में फ़ाइल को पढ़ने पहले, फ़ाइल को हटाने, तो प्रतिक्रिया लौटाएँ यह किया:

 // Read the file into a byte[] so we can delete it before responding 
     byte[] bytes; 
     using (var stream = new FileStream(path, FileMode.Open)) 
     { 
      bytes = new byte[stream.Length]; 
      stream.Read(bytes, 0, (int)stream.Length); 
     } 
     File.Delete(path); 

     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
     result.Content = new ByteArrayContent(bytes); 
     result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
     result.Content.Headers.Add("content-disposition", "attachment; filename=foo.bar"); 
     return result; 
+1

आशा है कि आपकी फ़ाइलें बहुत बड़ी नहीं हैं। –

4

DeleteOnClose विकल्प वाले फ़ाइलस्ट्रीम से अपना StreamContent बनाएं।

return new HttpResponseMessage(HttpStatusCode.OK) 
{ 
    Content = new StreamContent(
     new FileStream("myFile.txt", FileMode.Open, 
       FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose) 
    ) 
}; 
संबंधित मुद्दे