2011-09-28 17 views
9

मेरा प्रश्न वास्तव में Download and open pdf file using Ajaxपीडीएफ फाइल डाउनलोड के लिए JQuery अजाक्स कॉल

लेकिन नहीं के समान ही है, कारण मैं एक JQuery ajax चाहते है कि मेरे फ़ाइल डेटा जहाँ से दिलवाया जाएगा, जो कि गतिशील रूप से उत्पन्न किया जा रहा है है समान पृष्ठ।

तो मूल रूप से मेरे पास एक जेसन ऑब्जेक्ट है जिसे सर्वर पर भेजा जाना आवश्यक है जो गतिशील रूप से फ़ाइल उत्पन्न करेगा और इसे ब्राउज़र पर वापस भेज देगा।

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

कृपया मुझे बताएं यदि मेरा वर्कफ़्लो सही है या मैं एक अलग प्रवाह का उपयोग कर एक ही चीज़ प्राप्त कर सकता हूं।

उत्तर

8

आपको फ़ाइलों को डाउनलोड करने के लिए AJAX का उपयोग नहीं करना चाहिए। यह काम नहीं करता है। यह कहा जा रहा है आप 2 विकल्प के साथ छोड़ दिया जाता है:

  1. कार्रवाई लिंक और क्वेरी स्ट्रिंग पैरामीटर या डाउनलोड कुछ विशिष्ट जावास्क्रिप्ट घटना में trigerred किया जाना चाहिए अगर आप भी कार्रवाई है कि उत्पन्न करने के लिए माना जाता है करने के लिए सेट कर सकते हैं window.location.href पीडीएफ फ़ाइल और पास क्वेरी स्ट्रिंग पैरामीटर पास करें।

  2. या आप डर आप डेटा के बहुत सारे है कि नियंत्रक कार्रवाई है कि पीडीएफ उत्पन्न होगा करने के लिए पारित करने के लिए आप method="POST" के साथ एक <form> का उपयोग करें और अंदर आप छिपा क्षेत्रों का उपयोग आप जितना मापदंडों और डाटा स्टोर करने डाउनलोड करने के लिए कर रहे हैं जैसे:

    @using (Html.BeginForm("download", "home")) 
    { 
        ... hidden fields containing values that need to be sent to the server 
        <input type="submit" value="Download PDF" /> 
    } 
    
+0

डारिन: सर्वर पर फ़ाइल को AJAX GET अनुरोध के साथ उत्पन्न करने के बारे में आप क्या सोचते हैं? यह मुझे विफल कॉलबैक में फ़ाइल पीढ़ी के दौरान सर्वर पर होने वाली किसी भी त्रुटि को पकड़ने और उपयोगकर्ता को दिखाने की अनुमति देता है। यदि सफलता हो, तो मैं AJAX सफलता कॉलबैक में फ़ाइल नाम पास करता हूं और 'window.location = server \ folder \ filename' करता हूं। मैं यहां एएसपी.नेट वेब एपीआई के साथ काम कर रहा हूं। –

+0

ओपी विशेष रूप से AJAX के लिए पूछा। यह बैंडविड्थ का अपशिष्ट है। – CodeWarrior

+0

@OmarPadilla, आप क्लाइंट को AJAX का उपयोग कर फ़ाइलों को डाउनलोड नहीं कर सकते हैं।लेकिन अगर यह संभव था तो आप बैंडविड्थ की वही मात्रा बर्बाद कर देते थे जैसे कि आपने फ़ाइल डाउनलोड करने के लिए सीधा लिंक इस्तेमाल किया था। इसका सरल कारण यह है कि दोनों मामलों में आप सर्वर पर एक ही एंडपॉइंट को कॉल कर रहे हैं जो एक ही फाइल को वापस कर रहा है। और यह सोचने में मूर्ख मत बनो कि अगर आप AJAX का उपयोग नहीं करते हैं, तो वर्तमान पृष्ठ * पुनः लोड * होगा। फ़ाइल को स्ट्रीम करने वाले नियंत्रक कार्रवाई के अलावा कोई अतिरिक्त अनुरोध नहीं है। –

1
इसके बजाय अपने पृष्ठ आप पीडीएफ डाउनलोड प्रदर्शन करने के लिए एंकर टैग और php बल डाउनलोड उपयोग कर सकते हैं में एक और ajax कॉल करने की

HTML 
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a> 

PHP 
<?php 
$fullPath = $_GET['fileSource']; 
if($fullPath) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    switch ($ext) { 
     case "pdf": 
     header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download 
     header("Content-type: application/pdf"); // add here more headers for diff. extensions 
     break; 
     default; 
     header("Content-type: application/octet-stream"); 
     header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    } 
    if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 
    readfile($fullPath); 
    exit; 
} 
?> 

मैं फ़ाइल आकार के लिए जाँच कर रहा हूँ क्योंकि अगर आप CDN CloudFront से पीडीएफ लोड करते हैं, आप जो 0kb में डाउनलोड करने के लिए, इस मैं इस हालत

if($fsize) {//checking if file size exist 
     header("Content-length: $fsize"); 
    } 
साथ जाँच कर रहा हूँ से बचने के लिए दस्तावेज़ बलों दस्तावेज़ का आकार प्राप्त नहीं होगा

मैं भी इस समस्या से जूझ रहा था, कोड के ऊपर मेरे लिए काम किया था। मुझे उम्मीद है कि यह

+2

अच्छा जवाब, हालांकि वास्तव में प्रासंगिक नहीं है, एएसपी.NET टैग दिया गया है। – porjolovsky

+0

धन्यवाद @porjolovsky – Hitesh

0

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

@Html.ActionLink("Convert Data into PDF", "PDFView", null, new { @class= "btn btn-info" }); 

ऊपर कोड एक लिंक बटन उत्पन्न करेगा और आप नियंत्रक के कार्य विधि तक पहुंच सकते हैं। इसके अलावा आप नियंत्रक से पीडीएफ फाइल वापस करने के लिए किसी भी तकनीक का उपयोग कर सकते हैं उदाहरण के लिए आप FileResult कक्षा का उपयोग कर पीडीएफ फाइल वापस कर सकते हैं।

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