Rumah >pembangunan bahagian belakang >tutorial php >Muat turun fail dalam PHP

Muat turun fail dalam PHP

王林
王林asal
2023-05-24 09:11:106002semak imbas

Apabila membangunkan tapak web atau aplikasi, kami selalunya perlu melaksanakan fungsi muat turun fail, yang boleh dicapai dengan mudah melalui PHP. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan fungsi muat turun fail.

1. Proses muat turun fail

Sebelum memuat turun fail, kita perlu memahami proses muat turun:

  1. Pengguna mengklik butang muat turun pada halaman web atau aplikasi;
  2. Pelayan menerima permintaan muat turun;
  3. Pelayan menyemak kebenaran pengguna dan kewujudan fail; >Pengguna menerima fail dan menyimpannya.
  4. 2. Bersedia untuk memuat turun fail
  5. Dalam PHP, kita boleh menggunakan fungsi readfile untuk membaca kandungan fail dan mengeluarkannya ke penyemak imbas. Walau bagaimanapun, kita perlu memastikan fail itu wujud, jika tidak pengecualian akan dibuang. Berikut ialah contoh kod ringkas:
$file_path = '/path/to/your/file/yourfile.extension';
if (file_exists($file_path))
{
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file_path));
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: ' . filesize($file_path));
    readfile($file_path);
    exit;
}
else
{
    die('File not found.');
}

Dalam kod di atas, kami mula-mula menggunakan fungsi file_exists untuk menyemak sama ada fail itu wujud Jika fail itu wujud, tetapkan fail pengepala HTTP untuk memberitahu penyemak imbas bahawa fail akan dimuat turun, dan dalam Kandungan Tentukan nama fail dalam -Disposition, nyatakan jenis fail dalam Content-Type, dan gunakan fungsi readfile untuk mengeluarkan kandungan fail.

3. Halang muat turun fail daripada pautan kecurian

Disebabkan sifat penyemak imbas, sesetengah tapak yang tidak baik mungkin mencuri fail anda, jadi kami perlu menghalang muat turun fail daripada pautan kecurian.

Kami boleh menambah kod berikut untuk mengelakkan muat turun fail daripada dicuri:

$referer = $_SERVER['HTTP_REFERER'];
if ($referer && !preg_match('/^https?://' . $_SERVER['SERVER_NAME'] . '/', $referer))
{
    header("HTTP/1.1 403 Forbidden");
    die("Access denied.");
}

Kod ini akan menyemak maklumat pengepala HTTP_REFERER dan memastikan ia sepadan dengan nama domain pelayan semasa, jika tidak , kembalikan kod status 403, akses dilarang.

4. Laksanakan muat turun bersegmen

Apabila memuat turun fail yang lebih besar, anda mungkin perlu melaksanakan fungsi muat turun bersegmen untuk mempercepatkan kelajuan muat turun dan mengurangkan penggunaan lebar jalur rangkaian. Dengan bantuan maklumat pengepala Julat HTTP 1.1, kami boleh melaksanakan muat turun bersegmen dengan mudah.

Berikut ialah contoh kod:

$file_path = '/path/to/your/file/yourfile.extension';
if (file_exists($file_path))
{
    $size = filesize($file_path);
    $start = 0;
    $end = $size - 1;
    
    if (isset($_SERVER['HTTP_RANGE']))
    {
        if (preg_match('/bytes=h*(d+)-(d*)[D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
        {
            $start = intval($matches[1]);
            if (!empty($matches[2]))
            {
                $end = intval($matches[2]);
            }
        }
    }
    if ($start > $end || $end > $size - 1 || $start < 0)
    {
        header('HTTP/1.1 416 Requested Range Not Satisfiable');
        header("Content-Range: bytes $start-$end/$size");
        exit;
    }
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file_path));
    header('Content-Transfer-Encoding: binary');
    header("Content-Range: bytes $start-$end/$size");
    header('Accept-Ranges: bytes');
    header('Content-Length: ' . ($end - $start + 1));
    header("Cache-control: private");
    header('Pragma: private');
    header('Expires: ' . gmdate('D, d M Y H:i:s T', time() + 3600));
    
    $fp = fopen($file_path, 'rb');
    fseek($fp, $start);
    $buffer_size = 1024 * 8; //每次读取8 KB
    $bytes_send = 0;
    while (!feof($fp) && ($bytes_send < $end - $start + 1))
    {
        $buffer = fread($fp, $buffer_size);
        echo $buffer;
        flush();
        $bytes_send += strlen($buffer);
    }
    fclose($fp);
    exit;
}
else
{
    die('File not found.');
}

Dalam kod di atas, kami mula-mula menyemak maklumat pengepala HTTP_RANGE dan jika maklumat pengepala tidak wujud, keluarkan keseluruhan fail. Jika maklumat pengepala wujud, offset mula dan offset tamat dihuraikan, kemudian fungsi fseek digunakan untuk mencari penuding fail, dan fungsi fread digunakan untuk membaca kandungan fail dan mengeluarkannya ke penyemak imbas.

5. Kesimpulan

Tidak sukar untuk melaksanakan fungsi muat turun fail dalam PHP Kami hanya perlu menyemak sama ada fail itu wujud dan menetapkan maklumat pengepala HTTP yang betul. Menggunakan maklumat pengepala Julat HTTP 1.1 boleh mencapai muat turun tersegmen dengan mudah dan menghalang muat turun fail daripada pautan yang dicuri boleh melindungi keselamatan fail. Oleh itu, kami boleh memilih untuk melaksanakan fungsi yang diperlukan mengikut keperluan kami untuk mencapai pengalaman pengguna yang lebih baik.

Atas ialah kandungan terperinci Muat turun fail dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Corak MVC dalam PHPArtikel seterusnya:Corak MVC dalam PHP