Membuat link download sekali pakai menggunakan PHP

0
Membuat link download sekali pakai menggunakan PHP

Link download sekali pakai sangat berguna untuk menjual barang digital secara online. Ini menyediakan cara yang aman untuk membagikan link download produk digital. Pengguna memungkinkan mengunduh file hanya sekali saja, setelah link download kedaluwarsa atau dihapus. Link download sekali pakai akan sangat ideal untuk memberikan produk digital (script, musik, video, dll) ke satu orang dan link akan kadaluwarsa setelah produk didownload.

Dengan link download sekali pakai, kamu tidak perlu secara manual memantau aktivitas unduhan untuk mengubah link download. Sebaliknya, link download akan segera berakhir setelah unduhan pertama. Dalam tutorial ini, saya akan memberikan tutorial cara menghasilkan link download sekali pakai di PHP dan menerapkan fungsi link download sementara pada aplikasi web menggunakan PHP.

Contoh script ini memungkinkan kamu menghasilkan link unik untuk mendownload file dari server. Link ini akan memungkinkan pengguna untuk mengunduh satu kali saja. Juga, link akan memiliki waktu kedaluwarsa dan akan kedaluwarsa sesuai waktu yang ditentukan.

Misalnya, kamu ingin menjual e-book di website kamu. E-book yang dijual di webmu seharga Rp 50rb, kamu dapat menggunakan skrip ini untuk memungkinkan pengguna itu mengunduh e-book yang bersangkutan hanya satu kali. Link download akan memberi mereka  waktu yang terbatas untuk mengklaim unduhan mereka.

Berikut adalah prosesnya:

  • Menghasilkan link download dengan kunci ID yang unik.
  • Membuat folder yang dilindungi untuk menyimpan kunci.
  • Membuat file dan menulis kunci unik untuknya.
  • Pada saat permintaan unduhan, kunci token dan waktu kedaluwarsa divalidasi.
  • Memaksa browser untuk mendownlod file.

Konfigurasi (config.php)

Variabel konfigurasi didefinisikan dalam file ini:

  • $files – Array file dengan ID unik.
    • Kamu dapat menentukan nama file yang berbeda yang sedang didownload. Ini membantu melindungi file asli.
    • Kamu dapat menentukan letak file, yang akan didownload dari dalam server atau dari luar server
  • BASE_URL URL website.
  • DOWNLOAD_PATH menentukan letak file download.php.
  • TOKEN_DIR menentukan letak direktori token tempat dimana kunci akan disimpan.
  • OAUTH_PASSWORD menyetel kata sandi otentikasi untuk membuat link download.
  • EXPIRATION_TIME menyetel waktu kapan file akan kedaluwarsa.
<?php
// Array file dengan ID yang unik
$files = array(
    'CDG12345' => array(
        'content_type' => 'application/zip',
        'suggested_name' => 'codingan.zip',
        'file_path' => 'files/test.zip',
        'type' => 'local_file'
    ),
    'CDG67890' => array(
        'content_type' => 'audio/mpeg',
        'suggested_name' => 'codingan.mp3',
        'file_path' => 'https://dl.dropboxusercontent.com/s/qqpufgqs9iwllk0/slow-spring-board.mp3',
        'type' => 'remote_file'
    ),
);

// URL utama
define('BASE_URL','http://'. $_SERVER['HTTP_HOST'].'/dl-sementara/');

// Path dari file download.php
define('DOWNLOAD_PATH', BASE_URL.'download.php');

// Path direktori "tokens" untuk menyimpan kunci/key
define('TOKEN_DIR', 'tokens');

// Kata sandi otentikasi untuk menghasilkan link download
define('OAUTH_PASSWORD','CODINGAN');

// Masa kedaluwarsa link download (contoh: +1 year, +1 month, +1 days, +10 hours)
define('EXPIRATION_TIME', '+2 minutes');

index.php

Di file ini, link akan ditampilkan untuk menavigasi ke file pembuatan link download (generate.php). Kata sandi otentikasi harus ditentukan dalam link query string.

<a href="generate.php?CODINGAN">Hasilkan link download</a>

Membuat dink download sementara (generate.php)

File ini membuat link download sementara dan mencantumkan link di halaman tersebut. Query string harus memiliki kata sandi otentikasi dan harus dicocokkan dengan yang ditentukan dalam file config.php, jika tidak, akan muncul error 404.

  • Mendapatkan kata sandi otentikasi dari query string.
  • Memvalidasi kata sandi otentikasi.
  • Meng-encode ID file dengan base64_encode() dalam PHP.
  • Menghasilkan kunci unik baru dengan stempel waktu menggunakan uniqid() di PHP.
  • Menghasilkan link download dengan ID file dan kunci file.
  • Mebuat folder yang dilindungi untuk menyimpan kunci.
  • Menuliskan kunci dalam file dan menaruh di folder token.
  • Menampilkan semua daftar link download di halaman web.
<?php
// Menyertakan file konfigurasi
require_once 'config.php';

// mengmbil kata sandi dari query string
$oauthPass = trim($_SERVER['QUERY_STRING']);

// Verifikasi kata sandi OAuth
if($oauthPass != OAUTH_PASSWORD){
    // Menghasilkan error 404, jika path salah
    header("HTTP/1.0 404 Not Found");
    exit;
}else{
    // Membuat daftar link untuk menampilkan file unduhan
    $download_links = array();

    // Jika file tersedia
    if(is_array($files)){
        foreach($files as $fid => $file){
            // Encode ID file
            $fid = base64_encode($fid);

            // Menghasilkan kunci unik yang baru
            $key = uniqid(time().'-key',TRUE);

            // Menghasilkan  link download
            $download_link = DOWNLOAD_PATH."?fid=$fid&key=".$key;

            // Menambahkan link download ke dalam daftar
            $download_links[] = array(
                'link' => $download_link
            );

            // Membuat direktori yang dilindungi untuk menyimpan kunci
            if(!is_dir(TOKEN_DIR)) {
                mkdir(TOKEN_DIR);
                $file = fopen(TOKEN_DIR.'/.htaccess','w');
                fwrite($file,"Order allow,deny\nDeny from all");
                fclose($file);
            }

            // Menuliskan kunci ke dalam daftar kunci
            $file = fopen(TOKEN_DIR.'/keys','a');
            fwrite($file, "{$key}\n");
            fclose($file);
        }
    }
}
?>

<!-- Menampilkan semua link download di halaman web -->
<?php if(!empty($download_links)){ ?>
    <ul>
    <?php foreach($download_links as $download){ ?>
        <li><a href="<?php echo $download['link']; ?>"><?php echo  $download['link']; ?></a></li>
    <?php } ?>
    </ul>
<?php }else{ ?>
    <p>Link tidak ditemukan...</p>
<?php } ?>

Mendownload file dengan link sementara (download.php)

Ini akan mendownload file dengan link download yang bersifat sementara.

  • Mendapatkan ID & kunci file dari query string URL.
  • Mendapatkan waktu dari kunci dan menghitung waktu kapan link download berakhir.
  • Mengambil kunci dari file token.
  • Loop melalui kunci untuk menemukan kecocokan, ketika kecocokan ditemukan, kunci akan dihapus dan proses download diperbolehkan.
  • Memasukkan kunci yang tersisa kembali ke file token.
  • Jika kecocokan ditemukan dan link tidak kadaluwarsa, paksa browser untuk mendownload file.
<?php
// Menyertakan file config
require_once 'config.php';

// Mendapatkan ID & kunci file dari URL
$fid = base64_decode(trim($_GET['fid']));
$key = trim($_GET['key']);

// Menghitung waktu berakhirnya link
$waktuSaatIni = time();
$keyTime = explode('-',$key);
$waktuExp = strtotime(EXPIRATION_TIME, $keyTime[0]);

// Mengambil kunci dari file token
$keys = file(TOKEN_DIR.'/keys');
$cocok = false;

// Loop melalui kunci untuk menemukan kecocokan
// ketika kecocokan ditemukan, kunci akan dihapus
foreach($keys as &$one){
    if(rtrim($one)==$key){
        $cocok = true;
        $one = '';
    }
}

// Memasukkan kunci yang tersisa kembali ke file token
file_put_contents(TOKEN_DIR.'/keys',$keys);

// Jika kecocokan ditemukan dan link tidak kadaluwarsa
if($cocok !== false && $waktuSaatIni <= $waktuExp){
    // Jika file tersebut ditemukan dalam array file
    if(!empty($files[$fid])){
        // Mendapatkan data file
        $contentType = $files[$fid]['content_type'];
        $namaFile = $files[$fid]['suggested_name'];
        $pathFile = $files[$fid]['file_path'];

        // Memaksa browser untuk mendownload file
        if($files[$fid]['type'] == 'remote_file'){
            $file = fopen($pathFile, 'r');
            header("Content-Type:text/plain");
            header("Content-Disposition: attachment; filename=\"{$namaFile}\"");
            fpassthru($file);
        }else{
            header("Content-Description: File Transfer");
            header("Content-type: {$contentType}");
            header("Content-Disposition: attachment; filename=\"{$namaFile}\"");
            header("Content-Length: " . filesize($pathFile));
            header('Pragma: public');
            header("Expires: 0");
            readfile($pathFile);
        }
        exit;
    }else{
        $respon = 'Link download tidak valid.';
    }
}else{
    // Jika file sudah diwdonload atau kadaluwarsa
    $respon = 'Link download telah kadaluwarsa.';
}
?>

<html>
<head>
    <title><?php echo $respon; ?></title>
</head>
<body>
    <h1><?php echo $respon; ?></h1>
</body>
</html>

 

BAGIKAN

Leave a Reply

avatar
400
  Subscribe  
Beritahu