Nasıl bir sağ tıklama gerektirmeyen bir PDF bir download linki oluşturabilirim?

5 Cevap php

I am working on a website where the visitor should be able to download a pdf file. (There are three links to choose from but that is irrelevant) I wanted to know how to make it so that the visitor can simply click the link and not have to

right click > Save (target) As...

PHP ve JavaScript veya çözümlere açığım. Teşekkürler.

EDIT: Ben PHP ve AJAX çağrı yoluyla dosyayı kaydetmek için javascript kullanabilir miyim?

EDIT2: Ben her üç dosyaları değiştirmek için basit olduğu için, sonunda Nirmal çözüm kullanılır. Ben üç PDF adlı 3 dosyalarını yapmak gerek yoktu ve ben el kodu anahtarını gerek yoktu. Onun / code ilk önce oldu ve çok hile yapar beri BalusC olsa onay alır.

5 Cevap

Temelde Tüm yapmanız gereken Content-Disposition header to attachment 'Farklı Kaydet' diyalog almak için ayarlamaktır. İşte başlama PHP örnek:

<?php
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment;filename="foo.pdf"');
    readfile('/path/to/foo.pdf');
?>

Yapamazsın ve JavaScript ile bunu yapmak istemiyorum.

Önemli not: nedeniyle kötü özelliği, MSIE 'Farklı Kaydet' diyalog varsayılan dosya adı content-disposition başlığındaki elde olmayacak, bunun yerine istek URL pathinfo son parçası olacak . Geçici çözüm için bu, örneğin, bağlantı PDF dosya ekleme http://example.com/pdf/foo.pdf. Hatta okumak için PHP bunun yararlanabilir pathinfo belirtilen PDF dosyasında. Burada temel bir örnek pdf.php:

<?php
    $file_name = $_SERVER['PATH_INFO'];
    $file = '/path/to/pdf/files' . $file_name;
    if (file_exists($file)) {
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment;filename="' . basename($file_name) . '"');
        header('Content-Length: ' . filesize($file));
        readfile($file);
    } else {
        header('HTTP/1.1 404 Not Found');
    }
?>

Ancak bu size ettik MultiViews üzerine böylece /pdf/ Bu PHP dosyası geçmesi, ya da en az, bir RewriteRule den /pdf/ varsayar için /pdf.php/.

Bu yaklaşımın en önemli avantajı, yeni bir PDF dosyası eklemek veya PDF dosya adını değiştirmek istediğiniz zaman kodunu değiştirmenize gerek kalmamasıdır.

Hatta otomatik olarak belirlenmesi ve doğru içerik türünü ayarlayarak daha genel yapabilirsiniz:

<?php
    $file_name = $_SERVER['PATH_INFO'];
    $file = '/path/to/all/files' . $file_name;
    if (file_exists($file)) {
        header('Content-Type: ' . mime_content_type($file_name));
        header('Content-Disposition: attachment;filename="' . basename($file_name) . '"');
        header('Content-Length: ' . filesize($file));
        readfile($file);
    } else {
        header('HTTP/1.1 404 Not Found');
    }
?>

files.php ya da öylesine ve o zaman http://example.com/files/foo.pdf, http://example.com/files/bar.zip, vs Örneğin erişebileceğiniz bir genel PHP downloader var adlandırın.

Umarım bu yardımcı olur.

. Apache kullanıyorsanız eğer yerine PHP sarıcı komut yazmak zorunda değil, sen PDF'leri içeren klasöründe bir htaccess dosyası ile yapabilirsiniz:

<Files *.pdf>
  Header set Content-Disposition attachment
</Files>

Görünüşe göre IE / Adobe Reader'ın bazı sürümleri Content-Disposition başlığı saygı yok. Sen ForceType application/octet-stream bu geçici bir çözüm bulabilirsiniz

<Files *.pdf>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>

Ilk bir başlık gönderirken dosyayı hizmet PHP kullanmayı deneyin Content-type: application/octet-stream.

Bunu yapmak için bir HTTP başlığı ekleyebilirsiniz, bir örnek var PHP Docs (örneğe bir bakın)

Aşağıdaki kod size yardımcı olabilir:

<?php
if(isset($_GET['docid'])){
    switch($_GET['docid']){
        case '1':
            $file = 'complete/path/to/pdf/file1';
            break;
        case '2':
            $file = 'complete/path/to/pdf/file2';
            break;
        case '3':
            $file = 'complete/path/to/pdf/file3';
            break;
        default:
            exit;
    }

    if(file_exists($file)){
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename='.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;
    }
}

Bir php dosyası (örneğin, download.php) olarak bu kodu kaydedin ve bağlantısından diyoruz. Ne script yapar bu pdf dosyasını okur ve tampon için çıktılar olmasıdır. Başlıkları indirme gibi eğilim zorlar.

To call the first pdf, href to '/path/to/download.php?docid=1'
To call the second pdf, href to '/path/to/download.php?docid=2'
To call the third pdf, href to '/path/to/download.php?docid=3'

Yani, sen işi yapmak için AJAX gerekmez.