2012-02-14 8 views
5

एएसपी.Net में (सी # के साथ) मैं इसमें सादा पाठ के साथ एक डीएटी फ़ाइल बनाने की कोशिश कर रहा हूं और इसे ब्राउज़र और बल डाउनलोड करने के लिए भेज रहा हूं। मैंने कई चीजों की कोशिश की है लेकिन मैं इसे काम नहीं कर सकता। मेरी aspx फ़ाइल में एक ImageButtonफोर्स डाउनलोड एएसपी.Net

<asp:ImageButton ID="btnSave" runat="server" CausesValidation="False" ImageUrl="~/Images/Stages/Database/Save.png" OnClick="btnSave_OnClick" Width="26px" /> 

OnClick-विधि मैं फ़ाइल बनाने और ब्राउज़र को भेजने के लिए कोशिश कर रहा हूँ में वहाँ है।

protected void btnSave_OnClick(object sender, EventArgs e) 
{ 
    string file = "test.dat"; 
    string fileName = "~\\Stages\\Broekx\\Databanken\\" + file; 

    FileStream fs = new FileStream(MapPath(fileName), FileMode.Open); 
    long cntBytes = new FileInfo(MapPath(fileName)).Length; 
    byte[] byteArray = new byte[Convert.ToInt32(cntBytes)]; 
    fs.Read(byteArray, 0, Convert.ToInt32(cntBytes)); 
    fs.Close(); 

    ImageButton btnSave = (ImageButton)FormViewStagesDummy.FindControl("btnSave"); 
    btnSave.Visible = false; 

    File.Delete(Server.MapPath(fileName)); 

    if (byteArray != null) 
    { 
     this.Response.Clear(); 
     this.Response.ContentType = "text/plain"; 
     this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 
     this.Response.BinaryWrite(byteArray); 
     this.Response.End(); 
     this.Response.Flush(); 
     this.Response.Close(); 
    } 
} 

फ़ाइल test.dat सही फ़ोल्डर में मौजूद है और उसके बाद यह बाइट्स में पढ़ा जा चुका है हटा दिया गया है। मैंने फ़ाइल को हटाने के बिना यह कोशिश की है और यह भी काम नहीं करेगा।

बीटीएन पर क्लिक करने के बाद बटन को छुपाया जाना चाहिए, इसलिए मैंने पैरामीटर को झूठी के लिए दृश्यमान सेट किया है।

मैंने सामग्री-प्रकार "एप्लिकेशन/ऑक्टेट-स्ट्रीम" या पीडीएफ फ़ाइल और सामग्री-प्रकार "एप्लिकेशन/पीडीएफ" के साथ भी कोशिश की है लेकिन कुछ भी काम नहीं करता है। पृष्ठ सामान्य रूप से लोड होता है और कोई फ़ाइल डाउनलोड नहीं की जा रही है।

+0

मुझे संदेह है कि प्रतिक्रिया का कुछ हिस्सा शीर्षकों के सामने भेजता है। मुझे यह भी समझ में नहीं आता कि आप फ़ाइल डाउनलोड करने के लिए एक प्रतिक्रिया की अपेक्षा कैसे करते हैं, और एक ही समय में एक बटन अदृश्य बनाते हैं। – CodesInChaos

+0

मैंने कुछ ऐसा सोचा लेकिन मैं यह काम कैसे कर सकता हूं? – Yoni

+1

एक साइड-नोट के रूप में: 'File.ReadAllBytes' देखें जो फ़ाइल को पढ़ने के लिए उपयोग की जाने वाली 5 लाइनों को प्रतिस्थापित कर सकता है। आपको केवल बहुत छोटी फाइलों के साथ ऐसा करना चाहिए, शायद 10kb तक। – CodesInChaos

उत्तर

3

क्या फ़ाइल स्ट्रिंग का पथ वास्तव में सही है?

this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 

क्या यह फ़ाइल नाम नहीं होना चाहिए?

प्रतिक्रिया में लिखे जाने से पहले आप फ़ाइल को क्यों हटा रहे हैं? क्या प्रतिक्रिया के माध्यम से फ़ाइल की सेवा करने के लिए और अधिक समझदारी नहीं होगी और फिर इसे हटा दें?

अर्थात फोन

File.Delete(Server.MapPath(fileName)); 
repsonse के बाद

आप प्रयास करना चाहिए:

Response.TransmitFile(Server.MapPath(fileName)); 
Response.End(); 

TransmitFile (आईआईएस की कैशिंग नियमों के आधार पर), क्योंकि यह मूल रूप से फ़ाइल संभवतः फ़ाइल Kernal कैश में कैश करने के लिए पैदा कर रहा सहित आईआईएस पर स्ट्रीमिंग offloads बहुत ही कुशल है। Response.End();

+0

मैंने फ़ाइल को हटाने के बिना कोशिश की है लेकिन यह या तो काम नहीं करता है। विधि में AddHeader केवल फ़ाइल का सुझाया गया नाम भरना होगा। तो पूरा रास्ता नहीं, लेकिन फ़ाइल नाम के लिए केवल एक सुझाव है। – Yoni

+0

क्या आपने Response.TransmitFile() की कोशिश की है? बाइनरीवाइट() के बजाय? – Seany84

+0

बस कोशिश की लेकिन एक ही परिणाम – Yoni

0
   Response.Clear(); 
       Response.ClearContent(); 
       Response.ClearHeaders(); 
       Response.ContentType = "text/plain"; 
       Response.AppendHeader("Content-Disposition", "attachment; filename = " + fileName); 
       Response.TransmitFile(Server.MapPath("~/foldername/" + fileName)); 
       Response.End();