এইচটিএমএল লিঙ্কে পিডিএফ ফাইল ডাউনলোডযোগ্য কিভাবে করবেন?


124

আমি নীচের মত ডাউনলোডের জন্য আমার ওয়েব পৃষ্ঠায় একটি পিডিএফ ফাইলের লিঙ্ক দিচ্ছি

<a href="myfile.pdf">Download Brochure</a>

সমস্যাটি তখন যখন ব্যবহারকারী এই লিঙ্কটিতে ক্লিক করে

  • যদি ব্যবহারকারী অ্যাডোব অ্যাক্রোব্যাট ইনস্টল করে থাকে তবে এটি অ্যাডোব রিডারে একই ব্রাউজার উইন্ডোতে ফাইলটি খুলবে।
  • যদি অ্যাডোব অ্যাক্রোব্যাটটি ইনস্টল না থাকে তবে ফাইলটি ডাউনলোড করার জন্য এটি ব্যবহারকারীর কাছে পপ-আপ হয়।

তবে আমি এটি সর্বদা ডাউনলোডের জন্য ব্যবহারকারীর কাছে পপ-আপ করতে চাই, "অ্যাডোব অ্যাক্রোব্যাট" ইনস্টল থাকুক বা না থাকুক।

দয়া করে বলুন আমি কীভাবে এটি করতে পারি?

উত্তর:


115

.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/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); 

পিএস: এবং অবশ্যই আপনার ফাইল চুরি করা থেকে রোধ করার জন্য "ফাইল" ভেরিয়েবলের উপর কিছু স্যানিটি চেক চালান যেমন ফাইল এক্সটেনশন গ্রহণ করবেন না, স্ল্যাশ অস্বীকার করবেন না, মানটিতে .pdf যুক্ত করুন as


2
আমি এটির সাথে আরও একটি সমস্যার মুখোমুখি হচ্ছি, যে আমার ফাইলটি / প্রোডাক্ট / ব্লোচার / মাইফিল.পিডিএফ-তে অবস্থিত আমি able ফাইল ভেরিয়েবলটি $ file_path = $ _SERVER ['DOCUMENT_ROOT'] হিসাবে দিচ্ছি। '/ পণ্য / ব্রোশিওর /'। ফাইল $; তবে এটি ফাইলটিকে "% 2Fvar% 2Fwww% 2Fweb15% 2Fweb% 2F প্রোডাক্টস% 2Fbrochure% 2myfile.pdf" হিসাবে ডাউনলোড করছে
প্রশান্ত

3
@ ট্র্যাভিসো "Content-type: application/force-download"এখানে কোথাও তালিকাভুক্ত নয়: iana.org/assignments/media-tyype/application এটি সম্পূর্ণ জাল শিরোনাম। দয়া করে শিরোনাম তৈরি করে প্রেরণ করবেন না। আপনি আপনার উত্তর আপডেট করতে পারে? ধন্যবাদ।
নিকোলাস উইলসন

4
যদিও এই কোডটি ভারব্যাটিম ব্যবহার করার সময় সতর্কতা অবলম্বন করুন। আপনি জিইটি-ভেরিয়েবলগুলি সরাসরি প্রবেশ করছেন বলে এটি একটি গুরুতর এলএফআই দুর্বলতার পরিচয় দেয় fopen
25:48

4
এই কোড সম্ভবত অন্যভাবে বিপজ্জনক। আপনি যদি fopen- এ এইচটিটিপি লিঙ্কগুলি পাস করেন তবে আমার মনে হয় এটি অন্য সার্ভার থেকে ফাইলটি পুনরুদ্ধার করবে। আক্রমণকারী দ্বারা প্রকাশিত পিডিএফ ফাইলগুলির জন্য আপনার অভ্যন্তরীণ নেটওয়ার্কটি স্ক্যান করার চেষ্টা করার জন্য ব্যবহার করা যেতে পারে।
ররি ম্যাকচুন

2
আপনি যে কোনও "স্যানিটি চেক" বাইপাস করা কত সহজ হবে তা উল্লেখ না করে আপনি "ফাইল" পরামিতিটি করছেন বলে মনে করেন। পাথ ইনজেকশন / ডিরেক্টরি ট্র্যাভারসাল আক্রমণ খুব সম্ভবত।
এভিডি

209

এটি একটি সাধারণ সমস্যা তবে খুব কম লোকই জানেন যে একটি সাধারণ এইচটিএমএল 5 সমাধান রয়েছে:

<a href="./directory/yourfile.pdf" download="newfilename">Download the pdf</a>

কোথায় newfilenameব্যবহারকারী ফাইল সংরক্ষণ করতে জন্য প্রস্তাবিত ফাইলের নাম নেই। অথবা সার্ভারসাইডের ফাইলনামে এটি ডিফল্ট হবে যদি আপনি এটি খালি রাখেন:

<a href="./directory/yourfile.pdf" download>Download the pdf</a>

সামঞ্জস্যতা: আমি এটি ফায়ারফক্স 21 এবং আয়রনে পরীক্ষা করেছিলাম, দুজনেই ভাল কাজ করেছেন। এটি HTML5- বেমানান বা পুরানো ব্রাউজারগুলিতে কাজ করতে পারে না। আমি পরীক্ষিত একমাত্র ব্রাউজারটি হ'ল ডাউনলোডটি জোর করে নি ...

এখানে সামঞ্জস্যতা পরীক্ষা করুন: http://caniuse.com/#feat=download


9
এটি একটি সহজ সমাধান তবে দুর্ভাগ্যক্রমে খুব ব্যাপকভাবে সমর্থিত নয়, এনএসপি। IE caniuse.com/#feat=download
বেনবুন

2
হ্যাঁ, আমি ঠিক জানি। এজন্য আমার সামঞ্জস্যতার পার্শ্ব-নোট রয়েছে। এবং আপনার উত্স অনুসারে আইই এবং সাফারি উভয়ই এই পদ্ধতির সমর্থন করে না, বা কমপক্ষে এখনও নয় :) যাইহোক, আপনি যদি সমস্ত ব্রাউজারগুলি ডাউনলোডকে জোর করে ডাউনলোড করতে চান তবে আমি এর পরিবর্তে অন্যান্য উত্তরগুলির কয়েকটি পরীক্ষা করার পরামর্শ দিচ্ছি ...
T_D

3
ক্রোম সংস্করণ 39.0.2171.65 (-৪-বিট) সহ একটি কবিতার মতো কাজ করে!
এডেলান্স

সমাধানটি সহজ তবে দুর্ভাগ্যক্রমে IE এবং সাফারিতে সমর্থিত নয়।
ভালকিরিলোভ

অ্যাক্সেসের অনুমতি নেই
হ্যাকবাল টিমজ

50

প্রতিটি ফাইল লাইনে লুপ করবেন না । ব্যবহার করুন readfile পরিবর্তে, তার দ্রুত। এটি পিএইচপি সাইট বন্ধ: http://php.net/manual/en/function.readfile.php

$file = $_GET["file"];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Type: application/force-download");
    header('Content-Disposition: attachment; filename=' . urlencode(basename($file)));
    // header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}

আপনার get ভেরিয়েবলটি স্যানিটাইজ করার বিষয়টি নিশ্চিত করুন কারণ কেউ কিছু পিএইচপি ফাইল ডাউনলোড করতে পারে ...


4
Readfile ফাংশন প্রকৃতপক্ষে দ্রুততর। আমি ব্যক্তিগতভাবে এই উত্তরটি স্বীকৃত উত্তরটির পরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি
জোসে গারিডো

24

পিএইচপি স্ক্রিপ্ট ব্যবহার না করে, ফাইলটি পড়তে এবং ফ্লাশ করতে, ব্যবহার করে শিরোনামটি পুনরায় লিখতে আরও ঝরঝরে .htaccess। এটি একটি "দুর্দান্ত" ইউআরএল রাখবে ( myfile.pdfপরিবর্তে download.php?myfile)।

<FilesMatch "\.pdf$">
ForceType applicaton/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

এটি কি আপনার সমস্ত পিডিএফ জোর করে ডাউনলোড করবে না?
টেকব্র্যাট

1
@ টেকব্র্যাট হ্যাঁ, তবে ওপি এটিই বলেছিল। আপনি যদি কেবল কয়েকটি পিডিএফ সীমাবদ্ধ করতে চান তবে ^\.pdf$নিয়মিত প্রকাশটি সম্পাদনা করুন ।
রব

1
@ টেকব্র্যাট বা .htaccess ফাইলটি কেবল এমন সাবফোল্ডারে রেখে দিন যেখানে এই আচরণের প্রয়োজন।
হাবাকুক

14

আমি সরল পুরানো এইচটিএমএল এবং জাভাস্ক্রিপ্ট / জিকুয়েরির সাথে এটি করার একটি উপায় পেয়েছি যা কৃত্রিমভাবে অবনমিত হয়। IE7-10, সাফারি, ক্রোম এবং এফএফ পরীক্ষিত:

ডাউনলোড লিঙ্কের জন্য এইচটিএমএল:

<p>Thanks for downloading! If your download doesn't start shortly, 
<a id="downloadLink" href="...yourpdf.pdf" target="_blank" 
type="application/octet-stream" download="yourpdf.pdf">click here</a>.</p>

jQuery (খাঁটি জাভাস্ক্রিপ্ট কোডটি আরও ভার্বোজ হবে) যা সামান্য দেরির পরে লিঙ্কটিতে ক্লিক করার অনুকরণ করে:

var delay = 3000;
window.setTimeout(function(){$('#downloadLink')[0].click();},delay);

আরও শক্তিশালী করতে আপনি এইচটিএমএল 5 বৈশিষ্ট্য সনাক্তকরণ যুক্ত করতে পারেন এবং যদি এটি না থাকে তবে window.open()ফাইলটি দিয়ে একটি নতুন উইন্ডো খোলার জন্য ব্যবহার করুন।


5

এটি কী:

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

পিডিএফ ফাইল পাঠানোর সময় সামগ্রী-প্রকারের অ্যাপ্লিকেশন / এক্স-পিডিএফ-নথি বা অ্যাপ্লিকেশন / পিডিএফ প্রেরণ করা হয়। অ্যাডোব রিডার সাধারণত এই এমআইএম টাইপের জন্য হ্যান্ডলারটি সেট করে তাই পিডিএফ এমএমআই টাইপের যে কোনও প্রকার পেলেই ব্রাউজারটি নথিটি অ্যাডোব রিডারকে দেয়।


3

আমি জানি আমি এর উত্তর দিতে খুব দেরী করেছি তবে জাভাস্ক্রিপ্টে এটি করার জন্য আমি একটি হ্যাক পেয়েছি।

function downloadFile(src){
    var link=document.createElement('a');
    document.body.appendChild(link);
    link.href= src;
    link.download = '';
    link.click();
}

0

এটা চেষ্টা কর:

<a href="pdf_server_with_path.php?file=pdffilename&path=http://myurl.com/mypath/">Download my eBook</a>

Pdf_server_with_path.php এর কোডটি হল:

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

$file = $_GET["file"] .".pdf";
$path = $_GET["path"];
$fullfile = $path.$file;

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($fullfile));
flush(); // this doesn't really matter.
$fp = fopen($fullfile, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp);

0

এখানে একটি ভিন্ন পদ্ধতির। আমি ওয়েব সার্ভার যুক্তি ব্যবহার করতে ব্রাউজার সমর্থনের উপর নির্ভর করা বা অ্যাপ্লিকেশন স্তরে এটিকে সম্বোধন করার চেয়ে পছন্দ করি।

যদি আপনি অ্যাপাচি ব্যবহার করে থাকেন এবং প্রাসঙ্গিক ডিরেক্টরিতে একটি .htaccess ফাইল রাখতে পারেন তবে আপনি নীচের কোডটি ব্যবহার করতে পারেন। অবশ্যই, আপনি এটি httpd.conf এও রাখতে পারেন, যদি আপনার এতে অ্যাক্সেস থাকে।

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

ফাইলসমাচের নির্দেশিকাটি কেবলমাত্র একটি রেজিেক্স তাই এটি আপনার পছন্দ মতো দানাদারভাবে সেট করা যেতে পারে বা আপনি অন্যান্য এক্সটেনশনে যোগ করতে পারেন।

উপরের পিএইচপি স্ক্রিপ্টগুলির প্রথম পংক্তির মতো শিরোনাম লাইন একই কাজ করে। আপনার যদি কন্টেন্ট-টাইপ লাইনগুলিও সেট করতে হয়, আপনি একই পদ্ধতিতে এটি করতে পারেন তবে আমি এটি প্রয়োজনীয় খুঁজে পাই নি।


0

আমি পিডিএফ ফাইলের পুরো ইউআরএলটি ব্যবহার করে আমার সমাধান করেছি (কেবলমাত্র ফাইলের নাম বা অবস্থান href- র পরিবর্তে): একটি href = "ডোমেন domain com / pdf / filename.pdf"


0

আপনার যদি ডাউনলোডের হার সীমাবদ্ধ করার প্রয়োজন হয় তবে এই কোডটি ব্যবহার করুন !!

<?php
$local_file = 'file.zip';
$download_file = 'name.zip';

// set the download rate limit (=> 20,5 kb/s)
$download_rate = 20.5;
if(file_exists($local_file) && is_file($local_file))
{
header('Cache-control: private');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($local_file));
header('Content-Disposition: filename='.$download_file);

flush();
$file = fopen($local_file, "r");
while(!feof($file))
{
    // send the current file part to the browser
    print fread($file, round($download_rate * 1024));
    // flush the content to the browser
    flush();
    // sleep one second
    sleep(1);
}
fclose($file);}
else {
die('Error: The file '.$local_file.' does not exist!');
}

?>

আরও তথ্যের জন্য এখানে ক্লিক করুন


0
<!DOCTYPE html>  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
    <title>File Uploader</title>  
    <script src="../Script/angular1.3.8.js"></script>  
    <script src="../Script/angular-route.js"></script>  
    <script src="../UserScript/MyApp.js"></script>  
    <script src="../UserScript/FileUploder.js"></script>  
    <>  
        .percent {  
            position: absolute;  
            width: 300px;  
            height: 14px;  
            z-index: 1;  
            text-align: center;  
            font-size: 0.8em;  
            color: white;  
        }  

        .progress-bar {  
            width: 300px;  
            height: 14px;  
            border-radius: 10px;  
            border: 1px solid #CCC;  
            background-image: -webkit-gradient(linear, left top, left bottom, from(#6666cc), to(#4b4b95));  
            border-image: initial;  
        }  

        .uploaded {  
            padding: 0;  
            height: 14px;  
            border-radius: 10px;  
            background-image: -webkit-gradient(linear, left top, left bottom, from(#66cc00), to(#4b9500));  
            border-image: initial;  
        }  
    </>  
</head>  
<body ng-app="MyApp" ng-controller="FileUploder">  
    <div>  
        <table ="width:100%;border:solid;">  
            <tr>  
                <td>Select File</td>  
                <td>  
                    <input type="file" ng-model-instant id="fileToUpload" onchange="angular.element(this).scope().setFiles(this)" />  
                </td>  
            </tr>  
            <tr>  
                <td>File Size</td>  
                <td>  
                    <div ng-repeat="file in files.slice(0)">  
                        <span ng-switch="file.size > 1024*1024">  
                            <span ng-switch-when="true">{{file.size / 1024 / 1024 | number:2}} MB</span>  
                            <span ng-switch-default>{{file.size / 1024 | number:2}} kB</span>  
                        </span>  
                    </div>  
                </td>  
            </tr>             
            <tr>  
                <td>  
                    File Attach Status  
                </td>  
                <td>{{AttachStatus}}</td>  
            </tr>  
            <tr>  
                <td>  
                    <input type="button" value="Upload" ng-click="fnUpload();" />  
                </td>  
                <td>  
                    <input type="button" value="DownLoad" ng-click="fnDownLoad();" />  
                </td>  
            </tr>  
        </table>  
    </div>  
</body>  
</html>   

1
আপনি আপনার কোডটিতে কী সরবরাহ করেছেন তা আপনাকে ব্যাখ্যা করা উচিত। এমনকি সংক্ষিপ্ত আকারে বিশদে যদি সম্ভব না হয় বা বিশদে প্রয়োজন হয় না।
সুরজ কুমার

-1

একটি রুবি অন রেল অ্যাপ্লিকেশনগুলিতে (বিশেষত চিংড়ি রত্ন এবং প্রানটো রেল প্লাগইনগুলির মতো কিছু সহ) আপনি সম্পূর্ণ অন স্ক্রিপ্টের চেয়ে কিছুটা সহজভাবে এটি সম্পাদন করতে পারেন (পূর্ববর্তী পিএইচপি উদাহরণের মতো)।

আপনার নিয়ামক মধ্যে:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

রেন্ডার: লেআউট => মিথ্যা অংশটি ব্রাউজারকে "আপনি এই ফাইলটি ডাউনলোড করতে চান?" পিডিএফ রেন্ডার করার পরিবর্তে প্রম্পট করুন। তারপরে আপনি ফাইলটিতে সাধারণত লিঙ্ক করতে সক্ষম হবেন: http://mysite.com/myawesomepdf.pdf


এই কোডটি কোথায় লিখেছেন? কোন নিয়ামক, আমি পিএইচপি থেকে নতুন, দয়া করে ব্যাখ্যা করুন।
প্রশান্ত

@ প্রশান্ত এটি পিএইচপি নয়, এটি রুবেলগুলিতে রয়েছে।
eloyesp

@ প্রশান্ত: আপনার যদি পিএইচপি উদাহরণ প্রয়োজন হয় তবে থ্রেডটি আরও দেখুন তবে দয়া করে তারা কীভাবে নিরাপত্তাহীন হতে পারে সে সম্পর্কে মন্তব্যগুলি পড়ুন।
ইভান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.