سؤال

أنا إعطاء رابط ملف pdf على صفحة ويب تحميل, مثل أدناه

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

المشكلة هي عندما ينقر المستخدم على هذا الرابط ثم

  • إذا كان المستخدم قد قمت بتثبيت برنامج Adobe Acrobat ، ثم يفتح الملف في نفس نافذة المتصفح في برنامج أدوبي ريدر.
  • إذا Adobe Acrobat لم يتم تثبيت ثم المنبثقة المستخدم على تحميل الملف.

ولكن أريد دائما المنبثقة على المستخدم تحميل, بغض النظر عن "أدوبي أكروبات" تثبيت أو لا.

من فضلك قل لي كيف يمكنني فعل هذا ؟

هل كانت مفيدة؟

المحلول

بدلا من ربط .ملف PDF, بدلا تفعل شيئا مثل

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

الذي مخرجات مخصص رأس يفتح PDF (الثنائية آمنة) وطباعة البيانات إلى متصفح المستخدم ، ثم يمكنهم اختيار حفظ PDF على الرغم من إعدادات المتصفح.على 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); 

PS:و من الواضح تشغيل بعض التعقل الشيكات على "ملف" متغير لمنع الناس من سرقة الملفات الخاصة بك مثل لا يقبل امتداد الملف ينكر مائلة ، إضافة .pdf إلى قيمة

نصائح أخرى

هذه هي قضية مشتركة ولكن قلة من الناس تعرف أن هناك بسيطة HTML 5 الحل:

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

حيث newfilename هو من اقترح اسم المستخدم حفظ الملف.أو أنه سوف الافتراضي إلى اسم الملف على serverside إذا كنت اتركه فارغ مثل هذا:

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

التوافق:أنا اختبرت هذا على فايرفوكس 21 والحديد ، سواء عملت غرامة.قد لا تعمل على HTML5-غير المتوافقة أو التي عفا عليها الزمن المتصفحات.المتصفح الوحيد اختبرت ذلك لم يجبر تحميل IE...

التحقق من التوافق هنا: http://caniuse.com/#feat=download

لا حلقة كل ملف خط.استخدام طلب & readfile بل أسرع.هذا هو خارج الموقع php: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;
}

تأكد من تطهير الخاص بك الحصول على متغير شخص يمكن تحميل بعض ملفات php...

بدلا من استخدام PHP النصي, قراءة و مسح الملف أكثر أنيق إلى إعادة كتابة باستخدام رأس .htaccess.هذا وسوف تبقي على "لطيفة" URL (myfile.pdf بدلا من download.php?myfile).

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

لقد وجدت طريقة للقيام بذلك مع القديم عادي HTML و جافا سكريبت/مسج أن يحط بأمان.اختبار في IE7-10, رحلات السفاري, الكروم, FF:

HTML رابط التحميل:

<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>

مسج (نقية جافا سكريبت رمز سيكون أكثر مطول) الذي يحاكي النقر على الرابط بعد تأخير صغير:

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

لجعل هذا أكثر قوة يمكن إضافة ميزة HTML5 الكشف إذا لم يكن هناك ثم استخدام window.open() لفتح نافذة جديدة مع الملف.

هذا هو المفتاح:

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

نوع محتوى التطبيق/x-وثيقة pdf أو application/pdf يتم إرسالها أثناء إرسال ملف PDF.برنامج Adobe Reader وعادة ما يحدد معالج نوع MIME هذا حتى المتصفح سوف تمرير الوثيقة إلى برنامج Adobe Reader عند أي من PDF أنواع MIME يتم تلقيها.

هناك طريقة أسهل في HTML5:إضافة Download السمة.

كانت مدعومة من قبل معظم المتصفحات الحديثة.

<a download href="file.pdf">Download PDF</a> 

وأنا أعلم أنا في وقت متأخر جدا للإجابة على هذا ولكن وجدت هاك للقيام بذلك في جافا سكريبت.

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

جرب هذا:

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

هنا مقاربة مختلفة.أنا أفضل بدلا من الاعتماد على دعم المتصفح أو عنوان هذا في طبقة التطبيق لاستخدام ملقم ويب المنطق.

إذا كنت تستخدم Apache, و يمكن وضع .ملف htaccess في الدليل هل يمكن استخدام التعليمات البرمجية أدناه.بالطبع يمكنك وضع هذا في httpd.conf كذلك, إذا كان لديك الوصول إلى ذلك.

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

على FilesMatch التوجيه هو مجرد regex لذلك يمكن أن تكون على النحو granularly كما تريد أو يمكنك إضافة ملحقات أخرى.

رأس خط يفعل الشيء نفسه كما في السطر الأول في البرامج النصية PHP أعلاه.إذا كنت تحتاج إلى تعيين نوع المحتوى الخطوط كذلك, يمكنك أن تفعل ذلك بالطريقة نفسها ، ولكن لم أجد ذلك ضروريا.

لقد حللت لي باستخدام كله url من ملف PDF (بدلا من مجرد وضع اسم الملف أو الموقع href):a href="المجال .com/pdf/اسم الملف.pdf"

إذا كنت بحاجة إلى تحديد معدل التحميل استخدم هذا الرمز !!

<?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!');
}

?>

للحصول على مزيد من المعلومات انقر هنا

<!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>   

في روبي على القضبان التطبيق (خاصة مع شيء مثل الجمبري جوهرة و Prawnto القضبان المساعد) ، يمكنك إنجاز هذا قليلا أكثر بساطة مما كامل على البرنامج النصي (مثل السابق PHP سبيل المثال).

في وحدة التحكم الخاصة بك:

def index

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

تقديم :تخطيط => false جزء يحكي المتصفح لفتح "هل ترغب في تحميل هذا الملف ؟" موجه بدلا من محاولة تقديم PDF.ثم هل سيكون قادرا على رابط الملف عادة: http://mysite.com/myawesomepdf.pdf

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top