2015-10-09 5 views
16

मैंने कोड लिखा है जो फ़ाइल डाउनलोड करने के लिए कोणीय $ http का उपयोग करता है। फ़ाइल का नाम URL में निर्दिष्ट नहीं है। यूआरएल में फाइल के लिए एक अद्वितीय पहचानकर्ता है, जिसे एप्लिकेशन के बाहर से लाया जाता है।

जब $http.get(myUrl) कहा जाता है, तो सब ठीक काम करता है; फ़ाइल पुनर्प्राप्त की गई है और मैं इसे अपने कॉलबैक हैंडलर में एक्सेस कर सकता हूं, लेकिन मैं नहीं देख सकता कि फ़ाइल का नाम कैसे प्राप्त करें। Fiddler साथ कच्चे प्रतिक्रिया कैप्चरिंग, मैं इस देखें: ऊपर से

HTTP/1.1 200 OK 
Cache-Control: private 
Content-Length: 54 
Content-Type: application/octet-stream 
Server: Microsoft-IIS/8.5 
Access-Control-Allow-Origin: http://www.example.com/getFile/12345 
Access-Control-Allow-Credentials: true 
Content-Disposition: attachment; filename=testfile.txt 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Fri, 09 Oct 2015 20:25:49 GMT 

Lorem ipsum dolar sit amet! The contents of my file! 

, यह स्पष्ट है कि सर्वर "सामग्री-विन्यास" में फ़ाइल का नाम वापस भेज रहा है, लेकिन मैं नहीं मिला है वैसे भी मेरे कोणीय कॉलबैक के भीतर इसे एक्सेस करने के लिए। मैं हेडर से फ़ाइल का नाम कैसे प्राप्त करूं? नीचे दिए गए जवाब देने के लिए

जवाब में

संपादित करें: मैं उल्लेख किया है चाहिए इससे पहले कि मैं पहले से ही response.headers() की कोशिश की। यह Object {content-type: "application/octet-stream", cache-control: "private"} देता है, इसलिए मुझे अभी भी किसी कारण से सामग्री-विस्थापन नहीं मिलता है। response.headers('Content-Disposition')null देता है।

+0

यदि 'response.headers ('सामग्री-विन्यास') रिटर्न वहाँ स्पष्ट रूप से कुछ गलत है null'। @andrew का उत्तर सही है – spankmaster79

+0

क्या आपको कोई समाधान मिला? मेरे पास एक ही समस्या है: फिडलर स्पष्ट रूप से एक सही सामग्री स्वभाव शीर्षलेख दिखाता है, लेकिन नीचे दिए गए समाधानों में से कोई भी काम नहीं करता है: प्रतिक्रिया.हेडर ('सामग्री-विस्थापन') शून्य – fikkatra

+0

लौटाता है, मैं इसे विशेष के संदर्भ में काम करने में सक्षम था काम मैं कर रहा था, लेकिन मेरे पास एक अच्छा सामान्य जवाब नहीं है। –

उत्तर

5

उपयोग response.headers http प्रतिक्रिया हेडर प्राप्त करने के लिए:

$http.get(myUrl).then(function (response) { 
    // extract filename from response.headers('Content-Disposition') 
} 
+0

मैंने पहले ही यह कोशिश की है। मुझे पहले इसका उल्लेख करना चाहिए था, इसलिए मैंने इसे अपने प्रश्न में जोड़ा। –

+3

दरअसल, आपको 'एक्सेस-कंट्रोल-एक्सपोज़-हेडर: कंटेंट-डिस्पोजिशन' के साथ हेडर का पर्दाफाश करना होगा। यह मानता है कि आपके पास सर्वर साइड प्रतिक्रिया का नियंत्रण है ... –

+0

मुझे इसे समझने में परेशानी हो रही है। क्या मुझे "प्रीफलाइट" प्रतिक्रिया या वास्तविक फ़ाइल में मौजूद प्रतिक्रिया पर "एक्सेस-कंट्रोल-एक्सपोज़-हेडर" की आवश्यकता है? –

4

हो सकता है कि आप पहले से ही समाधान खोजने, लेकिन मैं इस उत्तर पोस्ट करेंगे किसी और को इस समस्या है या नहीं।

$ http अनुरोध से सफलता कॉलबैक फ़ंक्शन में इन मानकों जोड़ें:

$http.get(myUrl).success(function (data, status, headers, config) { 
     // extract filename from headers('Content-Disposition') 
    }); 
26

यह आदेश HTTP हेडर से फ़ाइल नाम प्राप्त करने के लिए उल्लेख है कि, Content-Disposition हैडर निकालने लायक हो सकता है पर्याप्त नहीं है । आपको अभी भी इस हेडर वैल्यू से filename संपत्ति प्राप्त करने की आवश्यकता है।

शीर्षलेख मान का उदाहरण लौटा: attachment; filename="myFileName.pdf"

नीचे दिया गया कार्य filename="myFileName.pdf" निकालेगा, फिर "myFileName.pdf" निकालें और अंत में myFileName.pdf प्राप्त करने के लिए अतिरिक्त उद्धरण हटा दें।

आप नीचे दिए गए स्निपेट का उपयोग कर सकते हैं:

function getFileNameFromHttpResponse(httpResponse) { 
     var contentDispositionHeader = httpResponse.headers('Content-Disposition'); 
     var result = contentDispositionHeader.split(';')[1].trim().split('=')[1]; 
     return result.replace(/"/g, ''); 
    } 
8

आप CORS उपयोग करते हैं, आप सर्वर साइड पर प्रतिक्रिया हेडर के लिए "पहुंच-नियंत्रण-बेनकाब-हेडर" जोड़ने की जरूरत है। उदाहरण के लिए: Access-Control-Expose-Headers: x-filename, x-something-else

+1

आप आंशिक रूप से सच हैं। सीओआरएस के लिए, सर्वर को 'एक्सेस-कंट्रोल-एक्सपोज़-हेडर: कंटेंट-डिस्पोजिशन' के रूप में हेडर भेजना होगा। –

1

यदि response.headers('Content-Disposition') शून्य लौटाता है, तो response.headers.**get**('Content-Disposition'); का उपयोग करें।

बाकी @ एंड्रू का स्निपेट अब महान काम करता है।

let fileName = parseFilenameFromContentDisposition(response.headers('Content-Disposition')); 

function parseFilenameFromContentDisposition(contentDisposition) { 
    if (!contentDisposition) return null; 
    let matches = /filename="(.*?)"/g.exec(contentDisposition); 

    return matches && matches.length > 1 ? matches[1] : null; 
} 
0

ऊपर कुछ उत्तर लेकिन एक बुनियादी रेगुलर एक्सप्रेशन से उपयोग करने के लिए इसी तरह की है कि कैसे मैं यह बजाय हल है मैंने पाया कि (ExecuteAsync में कोड की निम्न पंक्ति जोड़कर ...) मेरी IHttpActionResult कार्यान्वयन की विधि काम किया (की प्रतिक्रिया ' HttpResponseMessage लौटा दी है):

response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); 

कोणीय: मैं तो के रूप में (की प्रतिक्रिया' इस प्रकार कोणीय में फ़ाइल नाम को हल करने में सक्षम था है $ http.get से हल किया वादा):

var contentDisposition = response.headers('Content-Disposition'); 
var filename = contentDisposition.split(';')[1].split('filename')[1].split('=')[1].trim(); 
संबंधित मुद्दे