2012-05-09 34 views
17

के साथ फ़ाइल का अनुरोध करें मेरे पास असामान्य आवश्यकता है। अनिवार्य रूप से मुझे एक तरीका चाहिए ताकि जब उपयोगकर्ता किसी लिंक या बटन पर क्लिक करेगा, तो उन्हें एक पीडीएफ प्राप्त होगा। यहां का मुश्किल हिस्सा यह है कि सर्वर पर सभी पर अनुरोध संसाधित नहीं करेगा जब तक कोई कस्टम हेडर नहीं भेजा जाता है (अन्यथा यह व्यक्ति को लॉग आउट किया जाता है और उन्हें लॉगिन स्क्रीन पर भेजता है)।कस्टम हेडर

इस समय हेडर काम करने के तरीके को बदला नहीं जा सकता है, इसलिए कृपया उस पर ध्यान न दें; यह भविष्य में बदल जाएगा और एक आंतरिक अनुप्रयोग है जिसका मेरा कोई नियंत्रण नहीं है।

विकल्प का पता लगाया है:

  • Iframe का उपयोग करके या बस मार्ग में किसी प्रकार का है कि पीडीएफ वापस आ जाएगी साथ एक नई विंडो खोलने। यह काम नहीं कर सकता क्योंकि मैं पीडीएफ के लिए आवश्यक शीर्षलेख निर्दिष्ट नहीं कर सकता और पीडीएफ तक पहुंचने से पहले इसे पुनर्निर्देशित किया जाएगा।
  • एक फॉर्म का उपयोग करना और अनुरोध जमा करना काम नहीं कर सकता क्योंकि मैं फॉर्म में किसी कस्टम हेडर को जोड़ नहीं सकता (केवल एक्सएचआर और प्लगइन्स कर सकते हैं, AFAIK)।
  • एक्सएचआर का उपयोग करना काम नहीं कर सकता है, जबकि यह हेडर जोड़ सकता है और फ़ाइल पुनर्प्राप्त कर सकता है, क्लाइंट पक्ष पर इसे सहेजने का कोई तरीका नहीं है।

यह इस बिंदु पर अपने ही विकल्प प्रकट होता अनिवार्य रूप से कर रहे हैं:

  • फ़ाइल अनुरोध करने के लिए इस तरह के प्लगइन Flash या Silverlight के रूप में किसी प्रकार का उपयोग करें।
  • अपेक्षित अपेक्षा से पहले आवश्यकता के परिवर्तन को मजबूर करें ताकि एक शीर्षलेख की आवश्यकता न हो।

क्या मुझे कुछ भी याद आ रही है? मुझे उम्मीद है कि कोई मेरे निष्कर्षों को सत्यापित कर सकता है या मुझे कुछ याद करने के लिए इंगित कर सकता है क्योंकि, जहां तक ​​मैं कह सकता हूं, वास्तव में ऐसा कुछ भी नहीं है जो मैं कर सकता हूं।

संपादित करें: यह उपयुक्त लगता है और इस बात की पुष्टि है कि मैं क्या सोच रहा था: XMLHttpRequest to open PDF in browser

+2

ऐप और आपकी स्क्रिप्ट के बीच किसी प्रकार की सुरंग जोड़ने के बारे में कैसे? सुरंग ऐप से पूछताछ कर सकती है और फ़ाइल प्राप्त कर सकती है, और उसके बाद फ़ाइल को उपयोगकर्ता को फ्लश करने से पहले एक उचित शीर्षलेख सेट कर सकता है, इस प्रकार वास्तव में डाउनलोड को ट्रिगर कर सकता है। मुझे नहीं पता कि सुरक्षा के आधार पर आपके सिस्टम के लिए यह संभव है या नहीं। –

+0

एक सुरंग एक बुरा विचार नहीं है हालांकि मुझे यकीन नहीं है कि हम इसे यहां कार्यान्वित कर सकते हैं। हम्म। धन्यवाद, मैं इसे देख लूंगा। – Kris

+1

यदि आप आईई <10 (बहुत संभावना नहीं है, सही?) के लिए समर्थन के बिना कर सकते हैं, तो आप XMLHttpRequest स्तर 2 (XHR2) और ब्लॉब यूआरएल का उपयोग कर सकते हैं। यहां एक उदाहरण दिया गया है: http://stackoverflow.com/q/9620497 यह भी देखें http://stackoverflow.com/q/6165266 और http://www.html5rocks.com/en/tutorials/file/xhr2/ –

उत्तर

13

क्रोम में काम करने के लिए परीक्षण किया गया:

function toBinaryString(data) { 
    var ret = []; 
    var len = data.length; 
    var byte; 
    for (var i = 0; i < len; i++) { 
     byte=(data.charCodeAt(i) & 0xFF)>>> 0; 
     ret.push(String.fromCharCode(byte)); 
    } 

    return ret.join(''); 
} 


var xhr = new XMLHttpRequest; 

xhr.open("GET", "/test.pdf"); //I had test.pdf this on my local server 


xhr.addEventListener("load", function(){ 
    var data = toBinaryString(this.responseText); 
    data = "data:application/pdf;base64,"+btoa(data); 
    document.location = data; 
}, false); 

xhr.setRequestHeader("magic", "header"); 
xhr.overrideMimeType("application/octet-stream; charset=x-user-defined;"); 
xhr.send(null); 

आप डाउनलोड संकेत दिया जाना आवेदन/ओकटेट धारा के लिए आवेदन/पीडीएफ बदल सकते हैं। लेकिन क्रोम के पाठक से भी डाउनलोड करना बहुत आसान है।

फ़ायरफ़ॉक्स में कुछ भी नहीं होता है मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरे पास application/pdf स्थापित करने के लिए प्लगइन नहीं है।एप्लिकेशन/ऑक्टेट-स्ट्रीम में बदलना एक डीएल संकेत देगा।

IE के साथ

मैं तुम्हें VBScript/ActiveX hackery

किसी तरह की जरूरत है फ़ाइल बहुत बड़ा है, डेटा uri का उपयोग कर ब्राउज़र को नष्ट कर सकता है, उस मामले में आप BlobBuilder का उपयोग करें और यूआरएल वस्तु कर सकते हैं लगता है।

+1

डाउनलोड के लिए कस्टम फ़ाइल नाम डालना संभव है? –

2

इसके बजाय .PDF फ़ाइल को जोड़ने के बजाय, जैसे

<a href="pdf_server.php?file=pdffilename">Download my eBook</a> 

जो एक कस्टम हेडर आउटपुट कुछ करना, पीडीएफ खोलता है (बाइनरी सुरक्षित) और डेटा को उपयोगकर्ता के ब्राउज़र में प्रिंट करता है, फिर वे अपनी ब्राउज़र सेटिंग्स के बावजूद पीडीएफ को सहेजना चुन सकते हैं। pdf_server.php इस तरह दिखना चाहिए:

header("Content-Type: application/octet-stream"); 

$file = $_GET["file"] .".pdf"; 
header("Content-Disposition: attachment; filename=" . urlencode($file)); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Description: File Transfer");    
header("Content-Length: " . filesize($file)); 
flush(); // this doesn't really matter. 
$fp = fopen($file, "r"); 
while (!feof($fp)) 
{ 
    echo fread($fp, 65536); 
    flush(); // this is essential for large downloads 
} 
fclose($fp); 

संपादित करें: केवल एक ब्राउज़र (क्लाइंट-साइड) के अंदर से एक अनुरोध करने के लिए शीर्ष लेख जोड़ने के लिए जिस तरह से XmlHttpRequest setRequestHeader विधि का उपयोग है।

xhr.setRequestHeader('custom-header', 'value'); 
+0

यह अनिवार्य रूप से मेरा पहला विचार था, हालांकि, शीर्षलेख को क्लाइंट-साइड जोड़ा जाना चाहिए क्योंकि सर्वर केवल हेडर के बिना कुछ भी संसाधित नहीं करेगा। इसलिए, जब तक कि मैं अपने क्लाइंट और वर्तमान सर्वर आर्किटेक्चर के बीच कुछ उपयोग नहीं करता, कुछ भी सर्वर पक्ष निष्पादित नहीं किया जाएगा। – Kris

+0

आपको हेडर क्लाइंट-साइड जोड़ने की ज़रूरत नहीं है। यह तब तक काम करना चाहिए जब तक कि PHP फ़ाइल में शीर्षलेख से पहले बिल्कुल कोई पाठ न हो। –

+0

मुझे लगता है कि आप मेरी आवश्यकता को गलत समझते हैं। सर्वर जो पीडीएफ उत्पन्न करता है, सभी अनुरोधों के साथ एक कस्टम हेडर भेजने की आवश्यकता होती है। यदि हेडर नहीं भेजा जाता है तो यह माना जाता है कि उपयोगकर्ता लॉग आउट है, कोई सर्वर-साइड कोड नहीं चलाया जाता है और व्यक्ति को लॉगिन स्क्रीन पर रीडायरेक्ट किया जाता है। मैं अपने निष्कर्षों की पुष्टि करने की कोशिश कर रहा हूं क्योंकि मेरा मानना ​​है कि मैं एक अच्छा समाधान साबित करने में अविश्वसनीय रूप से सीमित हूं। – Kris

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