मैं डाउनलोड (पीडीएफ) के बजाय ब्राउज़र में फ़ाइलों को खोलने के लिए कैसे मजबूर करूं?


210

क्या ब्राउज़र में पीडीएफ फाइलों को खोलने के लिए मजबूर करने का एक तरीका है जब विकल्प "ब्राउज़र में पीडीएफ" अनियंत्रित है?

मैंने एम्बेड टैग और एक iframe का उपयोग करने की कोशिश की, लेकिन यह केवल तभी काम करता है जब उस विकल्प की जाँच की जाती है।

मैं क्या कर सकता हूँ?

जवाबों:


419

ब्राउज़र को इंगित करने के लिए कि फ़ाइल को ब्राउज़र में देखा जाना चाहिए, HTTP प्रतिक्रिया में ये हेडर शामिल होने चाहिए:

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

फ़ाइल को देखने के बजाय डाउनलोड करने के लिए :

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

फ़ाइल नाम के आसपास के उद्धरणों की आवश्यकता होती है यदि फ़ाइल नाम में विशेष वर्ण होते हैं, filename[1].pdfजो अन्यथा प्रतिक्रिया को संभालने के लिए ब्राउज़र की क्षमता को तोड़ सकते हैं।

आप HTTP प्रतिसाद हेडर कैसे सेट करते हैं यह आपके HTTP सर्वर पर निर्भर करेगा (या, यदि आप सर्वर-साइड कोड से पीडीएफ प्रतिक्रिया उत्पन्न कर रहे हैं: आपका सर्वर-साइड प्रोग्रामिंग भाषा)।


13
डाउनलोड करने के लिए मैं सामग्री-प्रकार: एप्लिकेशन / ऑक्टेट-स्ट्रीम का उपयोग करने के लिए बाध्य करता हूं।
पापिक जी। तबोदा

25
@ PapickG.Taboada लेकिन तब उपयोगकर्ता का सिस्टम फ़ाइल प्रकार को नहीं जान सकता है। उदाहरण के लिए, कुछ उपयोगकर्ताओं ने पीडीएफ फाइलों के लिए "इस प्रकार की हमेशा खुली हुई फाइलें" चुना हो सकता है। शायद यदि आप उपयोगकर्ता की वरीयताओं को ओवरराइड करना चाहते हैं तो ऑक्टेट-स्ट्रीम जाने का रास्ता होगा, लेकिन सही प्रकार और सुझाए गए फ़ाइलनाम को डाउनलोड प्रदान करने का "सही" तरीका है।
4

2
हाय @ColinM मैं यहाँ थोड़ा उलझन में हूँ ... हम मुद्दों को पीडीएफ प्रतिपादन कर रहे हैं, यह सिर्फ एक तले हुए पाठ देता है। हम सामग्री-प्रकार कहां सेट करते हैं: आवेदन / पीडीएफ सामग्री-विवाद: इनलाइन; "filename.pdf"? 'क्योंकि हम इसे कोणीय-जेएस कोड का उपयोग करके अपलोड करते हैं। तो मेरा सवाल यह है कि क्या अपलोड करने से पहले सामग्री का प्रकार निर्धारित किया जाना चाहिए? और भी, हमें बैकएंड टीम से केवल एक लिंक मिलता है, एक यूआरएल जो फ़ाइल पथ देता है, जिसे हम उपयोग करते हुए नए टैब में खोलते हैं: window.open (url, '_blank'); फ़ोकस ();
कैलास

3
@ कैलास मुझे समझ नहीं आ रहा है कि आप क्या करने की कोशिश कर रहे हैं .. जवाब हेडर का जिक्र है जो पीडीएफ फाइल के लिए HTTP अनुरोध का जवाब देते समय एक सर्वर को एक ग्राहक को भेजना चाहिए। इन हेडर का फ़ाइल अपलोड पर कोई प्रभाव नहीं पड़ता है, आपको क्लाइंट द्वारा डाउनलोड किए जाने पर हर बार हेडर को url सेट करने के पीछे कोड की आवश्यकता होती है।
कॉलिनम

1
@ कोलिनम धन्यवाद दोस्त, आपने इसे सही कहा, जब हमने डिबग किया तो मुद्दा फाइलों को अपलोड करते समय माइम प्रकार सेट किया गया था। यह बैक-एंड टीम द्वारा किया जाना चाहिए। मैंने जावा स्क्रिप्ट में हेडर जोड़ने के बारे में कोड प्राप्त करने की कोशिश की, लेकिन सफल नहीं रहा। धन्यवाद, जैसा कि मुझे असली विचार आप से मिला ... :)
कैलास

19

यदि आप HTML5 का उपयोग कर रहे हैं (और मुझे लगता है कि आजकल हर कोई इसका उपयोग करता है), तो एक विशेषता है download

उदाहरण के लिए,

<a href="somepathto.pdf" download="filename">

यहां filenameवैकल्पिक है, लेकिन अगर प्रदान किया जाता है, तो यह डाउनलोड की गई फ़ाइल के लिए यह नाम लेगा।


2
यदि आपके पास सर्वर कोड पर नियंत्रण है तो आपको 'अटैचमेंट' का उपयोग करना चाहिए क्योंकि यह उसी फ़ाइलनाम पीढ़ी कोड का उपयोग करने की अनुमति देगा। यदि आपके पास सर्वर पर कोई नियंत्रण नहीं है तो यह एक अच्छा समाधान है।
क्रिस्टोफ रूसो

यह समस्या का एक शानदार समाधान है, लेकिन हमेशा की तरह, IE हमें इसका उपयोग करने से रोक
Rory McCrossan

1
यह ध्यान रखना महत्वपूर्ण है कि यह डोमेन में काम नहीं करता है (उदाहरण के लिए, समान-मूल नीति रास्ते में मिलती है)। यदि एक डोमेन से डाउनलोड किया जाता है, तो सामग्री अलग डोमेन पर संग्रहीत होने पर डाउनलोड विशेषता काम नहीं करेगी। कॉर्स उस सामग्री को गुजरने की अनुमति दे सकता है (परीक्षण नहीं किया गया है)।
Vol7ron

59
यह शाब्दिक रूप से विपरीत है कि ओपी क्या पूछ रहा है :)
चक ले बट

1
हाँ लगा! : \ _ मैंने प्रश्न को गलत समझा और उत्तर दिया। लेकिन कई लोग यहां केवल विपरीत खोजते हैं, इसीलिए उत्तर को संपादित नहीं किया गया।
अक्षय

16

सही प्रकार application/pdfपीडीएफ के लिए है, नहीं application/force-download। यह कुछ विरासत ब्राउज़रों के लिए एक हैक की तरह दिखता है। यदि आप कर सकते हैं तो हमेशा सही mimetype का उपयोग करें।

यदि आपका सर्वर कोड पर नियंत्रण है:

  • जबरन डाउनलोड / शीघ्र: का उपयोग करें header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • ब्राउज़र इसे खोलने की कोशिश करता है: उपयोग करें header("Content-Disposition", "inline; filename=myfilename.myextension");

सर्वर कोड पर कोई नियंत्रण नहीं:

नोट: मैं सर्वर नाम पर फ़ाइल नाम सेट करना पसंद करता हूं क्योंकि आपके पास अधिक जानकारी हो सकती है और सामान्य कोड का उपयोग कर सकते हैं।


2

यदि आपके पास Apache है तो इसे .htaccessफ़ाइल में जोड़ें :

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>

हम कई एक्सटेंशन कैसे जोड़ सकते हैं? मैं DOC और XLS एक्सटेंशन भी जोड़ना चाहता हूं। कृपया मुझे सुझाव दें। अग्रिम में धन्यवाद।
कमलेश

इसके विपरीत जो पूछा जाता है, वह है
क्वेंटिन

1

उफ़, मेरी पिछली पोस्ट में टाइपिंग की त्रुटियाँ थीं।

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

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


4
क्या पिछली पोस्ट?
पीटर मोर्टेंसन

0

यह ASP.NET MVC के लिए है

अपने cshtml पेज में:

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

आपके नियंत्रक में:

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }

-1

हालांकि निम्नलिखित फ़ायरफ़ॉक्स पर अच्छी तरह से काम करता है, यह क्रोम और मोबाइल ब्राउज़र पर काम नहीं करता है।

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

क्रोम और मोबाइल ब्राउज़र त्रुटि को ठीक करने के लिए, निम्न कार्य करें:

  • अपनी फ़ाइलों को अपनी परियोजना की निर्देशिका में संग्रहीत करें
  • Google PDF Viewer का उपयोग करें

Google PDF व्यूअर का उपयोग इस प्रकार किया जा सकता है:

<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>

-4

रूटसेफ से डाउनलोड करें।

फिर लाइन 186 पर जाएं और इसे निम्नलिखित में बदलें:

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }

7
कोई उल्लेख नहीं है कि वे PHP का उपयोग करते हैं। क्या होगा यदि उनका बैकएंड पायथन या .NET में है?
मैक्सिम राउलर

1
... बायें क्षेत्र की बात करें। वह यह भी नहीं कहता कि वह किस ढांचे की बात कर रहा है।
धनु

-4

आप इसे निम्न तरीके से कर सकते हैं:

<a href="path to PDF file">Open PDF</a>

यदि पीडीएफ फाइल कुछ फ़ोल्डर के अंदर है और उस फ़ोल्डर में सीधे उस फ़ोल्डर में फ़ाइलों तक पहुंचने की अनुमति नहीं है, तो आपको .htaccessइस तरह से फ़ाइल सेटिंग का उपयोग करके कुछ फ़ाइल एक्सेस प्रतिबंधों को बायपास करना होगा:

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

लेकिन अब केवल कुछ आवश्यक फाइलों को अनुमति दें ।

मैंने इस कोड का उपयोग किया है और इसने पूरी तरह से काम किया है।


कोई उल्लेख नहीं है कि वे अपाचे का उपयोग करते हैं। यदि वे IIS का उपयोग करते हैं तो क्या होगा? या एक्सप्रेस?
मैक्सिमे रूइलर


-7

PHP में ब्राउज़र में देखने के लिए फ़ाइल को मजबूर करने का एक और तरीका है:

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';

1
headerआपके द्वारा अनुरोध निकाय के आउटपुट शुरू करने के बाद काम नहीं करता (और यह HTML दस्तावेज़ में संक्षिप्त करने के लिए एक स्ट्रिंग नहीं लौटाता)
Quentin

-9

बस Adobe Reader खोलें, मेनू → संपादित करेंवरीयताएँइंटरनेट , फिर ब्राउज़र मोड में बदलें या विभिन्न ब्राउज़रों पर विस्तृत निर्देशों के लिए ब्राउज़र में प्रदर्शन पीडीएफ की कोशिश करें एक्रोबैट, एक्रोबैट रीडर


3
यदि आप AdobeReader का उपयोग नहीं करते हैं या विंडोज़ का उपयोग नहीं करते हैं तो क्या होगा? तुम जवाब दो काम नहीं करेगा। इसके अलावा, उपयोगकर्ता को अपनी सेटिंग बदलने के लिए कहना होगा, जिसे आप वास्तविक दुनिया में नहीं कर सकते।
Clawfire

-12

यदि आप एक .PDF से लिंक करते हैं तो यह ब्राउज़र में खुल जाएगा।
यदि बॉक्स अनियंत्रित है तो उसे डाउनलोड को बाध्य करने के लिए .zip से लिंक करना चाहिए।

यदि .zip कोई विकल्प नहीं है, तो डाउनलोड को मजबूर करने के लिए PHP में हेडर का उपयोग करें

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 

हां, लेकिन मुझे ब्राउज़र को खोलने के लिए डाउनलोड न करने के लिए मजबूर करने का एक तरीका चाहिए। यदि संभव हो तो मुझे कोई पता नहीं है।
एलोएलिसबोआ 13

2
यदि आप इसे डाउनलोड करने के लिए मजबूर नहीं कर रहे हैं, तो आप इसे ब्राउज़र में खोलने के लिए मजबूर कर रहे हैं। यदि यह ब्राउज़र में नहीं खुलेगा, तो यह इसलिए है क्योंकि उपयोगकर्ता के पास विशिष्ट सेटिंग है, जिसे आप ओवरराइड नहीं कर सकते हैं या उनके पास पीडीएफ रीडिंग सॉफ़्टवेयर नहीं है।
किर्क स्ट्रोबेक

1
दरअसल, मेरा जवाब देखिए।
गेब्रियल रयान नह्मियास

21
ये गलत है। कोई एप्लिकेशन / फोर्स-डाउनलोड नहीं है। आप alskjdsdjk / aljksdlasdj का भी उपयोग कर सकते हैं। ब्राउज़र डाउनलोड करेगा क्योंकि यह इस माइम-प्रकार को नहीं जानता है। डाउनलोड के लिए सही माइम-टाइप मुझे एप्लिकेशन / ऑक्टेट-स्ट्रीम
पापिक जी। तबोदा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.