2015-10-10 20 views
5

में दूषित डाउनलोड मैं FileSaver.js का उपयोग कर फ़ाइल डाउनलोड करने का प्रयास कर रहा हूं, लेकिन जब भी मैं डाउनलोड बटन दबाता हूं तो मुझे दूषित फ़ाइल मिलती है।AngularJs एप

ऐप को एक PHP आरईएसटी सेवा द्वारा समर्थित किया गया है, और कमांड लाइन से curl का उपयोग करके पुष्टि करता है कि REST ठीक काम कर रहा है।

// Let str be the data received from $http promise 
// This code is run in a "then" callback 

var arr= new Uint8Array(str.length); 
for(var i=0; i<str.length; i++) { 
    arr[b]=str.charCodeAt(i); 
}; 
var blob = new Blob([arr], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

यह सिर्फ फ़ाइल भ्रष्ट:

यहाँ छद्म कोड है कि मैं डाउनलोड करने के लिए उपयोग करने के अंतिम संस्करण है।

मैंने Uint8Array को लागू किए बिना भी कोशिश की, और str सीधे Blob पर दे दिया। जैसा कि आपने अनुमान लगाया था, यह भी असफल रहा।

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

आरईएसटी में /files/:id जैसे यूआरएल हैं, जब एक्सेस किया जाता है, तो नियमित रूप से HTTP फ़ाइल डाउनलोड के रूप में फ़ाइल सामग्री प्रदान करता है (ऊपर बताए गए कर्ल के साथ परीक्षण किया जाता है)। $http समस्या हो सकती है? किसी भी तरह से प्राप्त डेटा पर कुछ प्रकार के एन्कोडिंग या कुछ मान्यताओं को मजबूर करना। मुझे वैसे भी कोणीय में ज्यादा अनुभव नहीं है।

+0

@ArtjomB नियमों के खिलाफ "धन्यवाद" कह रहा है? – vfsoraki

+0

आप यह कह सकते हैं: ['हाय', 'धन्यवाद,' टैगलाइन, और नमस्कार पदों से हटा दिया जाना चाहिए?] (Http://meta.stackexchange.com/q/2950/266187), लेकिन मत जाओ और पुरानी पोस्ट से इन चीजों को हटा दें। इससे उन्हें अवांछित ध्यान मिल सकता है। साथ ही, जब आप ऐसा करने के बारे में जाते हैं, तो आपको पोस्ट में सबकुछ ठीक करना चाहिए। इस संपादन को करने का कारण यह था क्योंकि किसी अन्य उपयोगकर्ता ने आपके प्रश्न के लिए PHP टैग का सुझाव दिया जो गलत लगता था क्योंकि आपने कहा है कि आपने उस भाग का परीक्षण किया है और यह काम करता है। मैंने फिर अपने संपादन के साथ अपने संपादन को खारिज कर दिया। –

उत्तर

5

मुझे समस्या मिली है। यह मुझे :)

मैं निर्दिष्ट करने के लिए $http के लिए responseType: "arraybuffer" तो Blob के लिए सीधे str देना था।

फिक्स्ड कोड

// Let str be the data received from $http promise 
// This code is run in a "then" callback 
// Make sure to specify "responseType: "arraybuffer"" for $http 

var blob = new Blob([str], {type: 'application/octet-stream'}); 
saveAs(blob, "AFileName"); 

मैं गलत जगह में responseType बदल रहा था।

+0

क्या आप निर्दिष्ट कर सकते हैं कि आपने वास्तव में प्रतिक्रिया प्रकार कहां जोड़ा है। (पथ, {}, { प्राप्त करें: { विधि: 'प्राप्त', responseType: 'arraybuffer' } } }) मैं इसे इस queryObject = $ संसाधन की तरह द्वारा जोड़ा जा रहा; – Achyut

+0

@Achyut मैंने '$ संसाधन 'का उपयोग नहीं किया, मैंने' $ http' का उपयोग किया। आप सोच सकते हैं कि '$ संसाधन' मानकों को '$ http' पैरामीटर' देने के बारे में मुझे लगता है। – vfsoraki

+0

ग्रेट, धन्यवाद। मैं यह जानकर पागल हो रहा था कि मेरे डाउनलोड क्यों दूषित हो गए थे। – javatutorial