2013-01-09 20 views
5

मैं चाहता हूं कि क्लाइंट एक बटन पर क्लिक करते समय मेरे डीबी पर संग्रहीत फाइल डाउनलोड करे। मैं यह AJAX अनुरोध भेजता हूं और इसे सर्वर की ओर से ले जाता हूं।एक्स्टजेस अजाक्स फ़ाइल डाउनलोड अनुरोध सी # एमवीसी

ExtJS:

downloadFile: function (a, b, c) { 
    var feed_id =this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
    Ext.Ajax.request({ 
     url: '/Feed/Download', 
     method: 'GET', 
     params: { 
      fileID: feed_id, //this.form.getComponent('file').value, 
     }, 
     failure: function (response) { 
      alert('failed !'); 
     }, 
     success: function (response) { 
      alert('success!'); 
     }, 
    }); 
}, 

तो यह कोड ब्लॉक के साथ अनुरोध को पूरा।

सी #:

public void Download(string fileID){ 
    Response.ContentType = "application/force-download"; 
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"Logo1.jpg\""); 
    Response.BinaryWrite(data); 
    Response.End(); 
} 

जब मैं फ़ायरबग के साथ नेटवर्क की जाँच की, यह मेरे अनुरोध इन मानकों के साथ सफलतापूर्वक रिटर्न लगता है।

Cache-Control private 
Content-Disposition attachment; filename="Logo1.jpg" 
Content-Type application/force-download 
Date Wed, 09 Jan 2013 12:51:54 GMT 
Server Microsoft-IIS/8.0 
Transfer-Encoding chunked 
X-AspNet-Version 4.0.30319 
X-AspNetMvc-Version 4.0 
X-Powered-By ASP.NET 
X-SourceFiles =?UTF-8?B?RTpcVXRrdUNhblxQcm9qZWN0c1xURlNcQlRPTVxCVE9NXEZlZWRcRG93bmxvYWQ=?= 

हालांकि यह सफल हो जाता है, डाउनलोड शुरू नहीं होता है। मैंने बहुत से प्रश्न और लेख पढ़े लेकिन अधिकांश जवाब कहते हैं कि बल-डाउनलोड हेडर जोड़ना समस्या हल करता है। मुझे किस बिंदु से याद आती है? धन्यवाद।

+1

आप वास्तव में यहां क्या पूछ रहे हैं? यह स्पष्ट नहीं है। – Liam

+0

डाउनलोड सर्वर की ओर से शुरू नहीं होता है? मैं इसे शुरू नहीं कर सका। फायरबग में प्रतिक्रिया फ़ील्ड ऐसा लगता है कि कुछ डेटा से भरा है लेकिन कोई डाउनलोड नहीं है। – tkcn

उत्तर

2

एक डाउनलोड आपके द्वारा दी गई सहायक

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult
  • में से एक का उपयोग करना चाहिए संभालने के लिए

अधिकांश बार मैं System.Web.MVC.FileStreamResult स्वयं का उपयोग कर रहा हूं। जैसे

FileStreamResult result = new FileStreamResult(stream, contentType); 
result.FileDownloadName = filename; // name of the downloaded file 

अद्यतन इसका इस्तेमालबस कुछ अपने संपादित

आप XHR अनुरोध का उपयोग कर डाउनलोड शुरू नहीं कर सकते हैं के आधार पर Infos। लेकिन वहाँ कम से कम दो तरीके कैसे आप यह कर सकते हैं:

  • फ़ाइल पथ ठीक है और आप जानते हैं कि यह top.location.href = "YourPath"; सेट ajax कॉल की सफलता हैंडलर के भीतर। [इन्फोस के बारे में top.location.href]
  • यदि आप फ्लाई पर फ़ाइल बनाते हैं और इसे वापस करना चाहते हैं तो आपको एक छिपी आईफ्रेम बनाना चाहिए और उसमें एक फॉर्म इंजेक्ट करना चाहिए जो अनुरोध को निष्पादित करता है।
+2

+1। मैं 'रिटर्न फाइल (फोटो, "छवि/जेपीजी") का उपयोग करता हूं;' जहां डेटाबेस डेटाबेस से बाइट [] है। – A1rPun

+0

@tkcn मैंने अपनी पोस्ट में AJAX कॉल से संबंधित Filedownloads के बारे में कुछ अतिरिक्त इन्फोस जोड़े। वे आपकी रूचि ले सकते हैं। – sra

+0

धन्यवाद, मैंने पहले से ही location.href का उपयोग किया है। लेकिन iframe विकल्प सीखना अच्छा है। धन्यवाद।बीटीडब्ल्यू अगर आप कमजोर हो, तो आप पर शर्म आती है। लेकिन अगर आपने नहीं किया, तो मुझे शर्म आती है: डी – tkcn

1

कुछ खोज के बाद, मैंने पाया कि location.href वही काम करता है और डाउनलोड संवाद बॉक्स खोलता है। सर्वर से आने वाली प्रतिक्रिया में वही हेडर जोड़ा जाना चाहिए। हालांकि, मुझे अभी भी पता नहीं है कि दूसरा दृष्टिकोण क्यों काम नहीं करता है।

var feed_id = this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
location.href = '/Feed/Download?fileID=' + feed_id; 

इससे मेरी समस्या हल हो गई।

+0

इस तरह के पैरामीटर पास करना संभव है। – tkcn

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