2016-01-27 10 views
11

में बाइट्स से फ़ाइल डाउनलोड करें मैं AJAX प्रतिक्रिया से बाइट्स के रूप में आने वाली फ़ाइल को डाउनलोड करना चाहता हूं।जावास्क्रिप्ट

मैं इसे Bolb की मदद से इस तरह से करने की कोशिश की:

var blob=new Blob([resultByte], {type: "application/pdf"}); 
var link=document.createElement('a'); 
link.href=window.URL.createObjectURL(blob); 
link.download="myFileName.pdf"; 
link.click(); 

यह वास्तव में पीडीएफ फाइल डाउनलोड कर रहा है लेकिन फाइल ही दूषित है।

मैं इसे कैसे पूरा कर सकता हूं?

+0

यह +1 टिप्पणी का एक छोटा सा है। मैं वही काम करने की कोशिश कर रहा हूं, और एक ही परिणाम के साथ - एक दूषित पीडीएफ। पीडीएफ खुल जाएगा, मेरे पास अपेक्षित पृष्ठों की संख्या है, लेकिन कोई टेक्स्ट नहीं है। मुझे संदेह है कि यह मुद्दा पीडीएफ के एन्कोडिंग में है, या इसे '[परिणामबीस]' से ब्लॉब में परिवर्तित कर रहा है ... मैं सुनना चाहूंगा कि आप समाधान के साथ आए हैं या नहीं। –

+0

@runlevelsix, हाँ मैंने यह समझ लिया! कृपया नीचे मेरा जवाब देखें और देखें कि यह आपके लिए भी काम करता है –

उत्तर

29

पर मैं सवाल लंबे समय उम्र पूछी निर्माता है, इसलिए मैं कुछ विवरण में गलत हो सकता है।

Blob जैसा कि इसे बाहर निकला है, उसे सरणी बफर की आवश्यकता है। यही कारण है कि बेस 64 बाइट्स को पहले सरणी बफर में परिवर्तित करने की आवश्यकता है।

function saveByteArray(reportName, byte) { 
    var blob = new Blob([byte]); 
    var link = document.createElement('a'); 
    link.href = window.URL.createObjectURL(blob); 
    var fileName = reportName + ".pdf"; 
    link.download = fileName; 
    link.click(); 
}; 

यहाँ कैसे एक साथ इन दो कार्यों का उपयोग करने के लिए है:

var sampleArr = base64ToArrayBuffer(data); 
saveByteArray("Sample Report", sampleArr); 

function base64ToArrayBuffer(base64) { 
    var binaryString = window.atob(base64); 
    var binaryLen = binaryString.length; 
    var bytes = new Uint8Array(binaryLen); 
    for (var i = 0; i < binaryLen; i++) { 
     var ascii = binaryString.charCodeAt(i); 
     bytes[i] = ascii; 
    } 
    return bytes; 
} 

यहाँ एक पीडीएफ फाइल को सेव करने के लिए अपने कार्य है:

यहाँ ऐसा करने के लिए समारोह है

+2

सबसे पहले, धन्यवाद, यह शानदार है और मैंने हर जगह देखा। दूसरा, समय क्या है? –

+1

@ मूल संस्करण में Grez.Kev, फ़ाइल नाम '' NowNow' और 'month' भी शामिल है। मैंने उस कोड को हटा दिया लेकिन इन दोनों के बारे में भूल गए। ध्यान देने के लिए धन्यवाद। वे अनावश्यक हैं, मुझे विश्वास है। –

+0

इस समाधान को पोस्ट करने के लिए धन्यवाद! मेरे अनुरोध के बारे में पता लगाने के लिए बहुत बड़ा है 'window.location (बाइट [] को पीडीएफ के रूप में खोलने का प्रयास करते समय त्रुटि) – alsco77

0

सेट Blobtype पर Blob बजाय createObjectURL

var blob = new Blob([resultByte], {type: "application/pdf"}); 
var link = document.createElement("a"); 
link.href = window.URL.createObjectURL(blob); 
link.download = "myFileName.pdf"; 
link.click(); 
+0

यही वह है जो मैंने वास्तव में किया था। इसे यहाँ मिस्टीप किया। धन्यवाद –

+0

क्या 'जेएस' अपेक्षित परिणाम लौटाता है? फ़ाइल का वर्णन स्वयं दूषित हो सकता है "? – guest271314

0

आपको बस एक अतिरिक्त लाइन जोड़ने की आवश्यकता है और इसे काम करना चाहिए। आपकी प्रतिक्रिया आपके सर्वर अनुप्रयोग से बाइट सरणी है

var bytes = new Uint8Array(resultByte); // pass your byte response to this constructor 

var blob=new Blob([bytes], {type: "application/pdf"});// change resultByte to bytes 

var link=document.createElement('a'); 
link.href=window.URL.createObjectURL(blob); 
link.download="myFileName.pdf"; 
link.click(); 
संबंधित मुद्दे