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