force indir komut

4 Cevap php

Ben amacı emin dosyalar olursa olsun olduğunu ne tür bir dosya indirmek yerine tarayıcıda görüntülenen sunuluyor yapmaktır güzel bir "kuvvet dosya indirme" senaryosu üzerine çalıştı.

Iyi çalışması için kullanılan ancak son zamanlarda i özellikle pdf ve xls dosyaları (MS Excel) için, işe yaramayacağını geri aldı. Dosya ya da PDF halinde "geçersiz" olarak algılanan veya xls dosyası halinde içeriğinin üstüne html dosya dizin sayfasının bir bölümünü alır edilir.

Ne benim fonksiyonu ile tam olarak yanlıştır?

İşte burada. Bir url veya yerel yol ile ya da çalışabileceğini unutmayın.

    function offerToDownloadFile($filename, $access_type='url') {
    /*
    PHP FORCE DOWNLOAD SCRIPT
    */

    // required for IE, otherwise Content-disposition is ignored
        if (ini_get('zlib.output_compression'))
            ini_set('zlib.output_compression', 'Off');

        if($access_type === 'url') {
        // access type is via the file 's url
            $parsed_url = parse_url($filename);
            $fileinfo = pathinfo($filename);
            $parsed_url['extension'] = $fileinfo['extension'];
            $parsed_url['filename'] = $fileinfo['basename'];
            $parsed_url['localpath'] = LOCALROOT . $parsed_url['path'];
        }
        else {
        // access type is the local file path
            $fileinfo = pathinfo($filename);
            $parsed_url['localpath'] = $filename;
            $parsed_url['filename'] = basename($filename);
            $parsed_url['extension'] = $fileinfo['extension'];
        }


        // just in case there is a double slash created when joining document_root and path
        $parsed_url['localpath'] = preg_replace('/\/\//', '/', $parsed_url['localpath']);

        if (!file_exists($parsed_url['localpath'])) {
            die('File not found: ' . $parsed_url['localpath']);
        }
        $allowed_ext = array('ics','pdf', 'png', 'jpg', 'jpeg', 'zip', 'doc', 'xls', 'gif', 'exe', 'ppt','ai','psd','odt');
        if (!in_array($parsed_url['extension'], $allowed_ext)) {
            die('This file type is forbidden.');
        }

        switch ($parsed_url['extension']) {
            case "ics": $ctype="text/calendar";
                break;
            case "pdf": $ctype = "application/pdf";
                break;
            case "exe": $ctype = "application/octet-stream";
                break;
            case "zip": $ctype = "application/zip";
                break;
            case "doc": $ctype = "application/msword";
                break;
            case "xls": 
                $ctype = "application/vnd.ms-excel";
                break;
            case "ppt": $ctype = "application/vnd.ms-powerpoint";
                break;
            case "gif": $ctype = "image/gif";
                break;
            case "png": $ctype = "image/png";
                break;
            case "jpeg":
            case "jpg": $ctype = "image/jpg";
                break;
            default: $ctype = "application/force-download";
        }
        header("Pragma: public"); // required
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private", false); // required for certain browsers
        header("Content-Type: $ctype");
        header("Content-Disposition: attachment; filename=\"" . $parsed_url['filename'] . "\";");
        header("Content-Transfer-Encoding: binary");
        //  header("Content-Length: " . filesize($parsed_url['localpath']));
        readfile($parsed_url['localpath']);
        clearstatcache();
        die();
        exit();
    }

4 Cevap

Komut artık çalışıyor. Ben bu başlığı yapmak zorunda kaldı () yerine çağırır. Ben gerçekten neden, bu çözüm götürdü ki deneme yanılma bilmiyorum.

header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"" . $parsed_url['filename'] . "\";");
header("Content-Transfer-Encoding: binary");
header('Accept-Ranges: bytes');
header("Cache-control: private");
header('Pragma: private');
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

Görülebilmesini aksine indirilebilir dosyaları zorlamak olursa hallederim nasıl elde etmek imkansız üzerinde yakın - Adobe'nin PDF Viewer gibi 3. parti bileşenleri sadece İçerik Eğilimi başlıkları görmezden ve seviyor ne şeyler yapmak zorlayabilir. Eğer genel kamu ile ilgili iseniz, kullanıcıların verileri alacak ve kendilerinin veya yazılım değil, web sitenizin bunu kullanmak nasıl belirleyecek kabul etmek zorunda.

Ben bu hiç yardımcı olsaydı emin değilim, ama aynı zamanda şu başlıkları koymayı deneyin:

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

MS ve PDF (ve diğerleri) ile sorun, örneğin MS Excel gibi 3PP yazılım ile açılacak zorunda kalıyor ve İçerik-Disposition görmezden olmasıdır.

Işe yaramazsa üzerinde, kullanıcıların tıklatın ve Farklı kaydet seçeneğini sağa olacak; muhtemelen sorunu için en iyi çözüm.

. örneğin, karşıdan zorlamak için bir htaccess alternatif dikkate değer olabilir:

AddType application/octet-stream csv
AddType application/octet-stream pdf
AddType application/octet-stream xls