Minggu, 05 Desember 2010

Menggunakan Header PHP Untuk Force Download

phpSering kali, saat membuat situs web, Anda mungkin menghadapi situasi di mana Anda ingin menyediakan file untuk di download. Sepintas kita bayangkan hal tersebut cukup mudah, yaitu kita hanya perlu membuat link menuju file di server kita. Namun permasalahannya dalam metode sederhana ini pada kenyataannya tidak sesuai yang diharapkan, karena setiap browser, platform, dll, dapat menangani berbagai macam jenis file dengan cara yang berbeda.

Sebagai contoh, katakanlah Anda memiliki file mp3 dari hit single terbaru Anda, dan anda ingin berbagi file tersebut dengan pengunjung situs. Anda dapat dengan hanya membuat link menuju file tersebut:
<a href="mysong.mp3">Download My Hit Single</a>
Yang jadi masalah dengan metode ini adalah bahwa sebagian besar browser memiliki kemampuan untuk memutar file mp3. Oleh karena itu, mereka akan secara otomatis mengisi Quicktime, atau plug-in lainnya dan mulai men-download file di browser mereka. Dengan demikian mereka tidak akan mendapatkan file tersebut di hard drive. pengunjung situs seperti anda hanya dapat menikmati file tersebut dari browser. Nah, dengan bahasa pemrograman PHP, kita dapat dengan cepat mengatasi hal tersebut.
Fungsi magis untuk melakukannya adalah header() function. Fungsi ini memungkinkan kita untuk mendefinisikan header HTTP baku sebagai string. Script kemudian akan mengeksekusi fungsi header dan memaksa browser untuk membuat halaman yang di inginkan.

hal yang pertama dilakukan kita perlu menentukan path ke file kita di PHP (sebagai string).
<?PHP
    // Define the path to file
    $file = 'mysong.mp3';
?>
Setelah kita memiliki path file kita pasti, Sekarang kita harus mengecek untuk memastikan bahwa itu benar-benar ada sebelum melanjutkan. Jika file tidak ada kita akan menampilkan pesan kesalahan ke layar browser.
if(!file_exists($file)))
{
    die('Error: File not found.');
}
Sekarang kita telah melewati cek ini, waktunya untuk pindah ke bagian kedua yaitu di mana kita mendefinisikan semua header kita.
else
{
    // Set headers
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$file");
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");
}
Kebanyakan dari parameter ini header cukup jelas. Yang penting di sini adalah file Transfer, attachment, and application/zip definitions. "Content-Description: File Transfer" akan membantu pengguna untuk medownload file. Definisi dari "Content-Disposition: attachment" pada baris berikutnya, untuk memberitahu browser bahwa kita memang akan menuju link ke file. Baris berikutnya, "Content-Type", memberitahu browser jenis aplikasi dasar file sebagai referensi.

Sekarang kita sudah memiliki semua header, apa yang kita lakukan? Yah sederhananya, kita membuka file menggunakan readfile() function. Ini benar-benar akan menjadi tempat di dalam tanda kurung kurawal lain.
// Read the file from disk
    readfile($file);
Kode yang sudah selesei terlihat seperti:
<?PHP
 // Define the path to file
 $file = 'ryboe_tag_cloud.zip';
 
 if(!file)
 {
     // File doesn't exist, output error
     die('file not found');
 }
 else
 {
     // Set headers
     header("Cache-Control: public");
     header("Content-Description: File Transfer");
     header("Content-Disposition: attachment; filename=$file");
     header("Content-Type: application/zip");
     header("Content-Transfer-Encoding: binary");
    
     // Read the file from disk
     readfile($file);
 }
 ?>
Jadi dari kode tersebut, kita memaksa untuk download file melalui file PHP. Ini benar-benar membuka banyak jalan dalam aplikasi web Anda karena sekarang Anda bisa membuat link download anda dinamis dan bahkan menambahkan pelacakan stat maju melalui database.