لینک غیر مستقیم برای فایل ها در PHP – بخش دوم

در این آموزش ابتدا نحوه ارسال فایل به کاربر توسط PHP را فرا خواهیم گرفت و در ادامه، آموزش بخش اول را که مبحث ایجاد لینک غیر مستقیم برای دانلود فایل ها بود، تکمیل خواهیم کرد. برای آنکه بتوانیم فایلی را به کاربر ارسال کنیم باید مراحل زیر اتفاق بیافتد:

۱- فایل را بخوانیم(read)

۲- header پاسخ را مقدار دهی کنیم

۳- داده های موجود در فایل را که در مرحله نخست خواندیم، در خروجی چاپ کنیم(write)

نکته: می توان مرحله خواندن و نوشتن را پشت سرهم انجام داد اما باید این نکته مهم را در نظر داشته باشیم که نوشتن باید بعد از مقدار دهی header اتفاق بیافتد.

[divider]

تابع readfile

یکی از توابعی که می تواند عملیات خواندن از فایل و نوشتن آن در خروجی را با هم انجام دهد تابع readfile است. به نمونه کد زیر دقت کنید:

$file = 'monkey.gif';
if (file_exists($file)){
   header('Content-Description: File Transfer');
   header('Content-Type:application/octet-stream');
   header('Content-Disposition: attachment;filename="'.basename($file).'"');
   header('Expires: 0');
   header('Cache-Control: must-revalidate');
   header('Pragma:public');
   header('Content-Length:'.filesize($file));
   readfile($file);
   exit;
}

 

در صورتی که کد بالا اجرا شود. فایل تصویری با نام monkey.gif به کاربر ارسال می شود و کاربر می تواند این فایل را دانلود نماید. به بیان دیگر مثلا اگر کد بالا در فایلی با نام download.php قرار گیرد و نشانی وب سایت ما http://example.com باشد، کاربر می تواند از طریق لینک http://example.com/download.php فایل را دانلود کند. با این کار کاربر نمی داند که فایل در چه آدرسی قرار دارد و صرفا می تواند با لینک غیر مستقیم اقدام به دانلود فایل کند.

دریافت آدرس مستقیم فایل‌ها از دیتابیس

برای تکمیل مبحث، باید کاری کنیم که فایل download.php مامور خواندن تمام فایل ها و ارسال آنها به کاربر شود. خب این کار بسیار ساده می تواند انجام شود. تنها کافیست تا پارامتری مانند id به این فایل ارسال شود. بطور مثال اگر آدرس سایت ما http://example.com است و لینک دانلود فایل‌ها توسط فایل download.php ایجاد می‌شود، با وارد کردن آدرس http://example.com/download.php?id=56 کاربر id با شماره ۵۶ را به ما ارسال می‌کند. در زبان PHP این پارامتر را می‌توان به کمک دستور زیر دریافت نمود:


$id = $_GET['id'];

حالا زمانی که کاربر به عنوان مثال لینک http://example.com/download.php?id=3 را وارد می کند، در دیتابیس به دنبال آدرس واقعی فایلی با id وارد شده می گردیم و در صورت پیدا کردن آدرس، فایل مورد نظر را خوانده و در خروجی قرار می دهیم. البته توجه کنید که اعداد ۵۶ و ۳ که در مثال‌های بالا ذکر کردیم، اعدادی فرضی هستند. کدی که ما برای upload فایل‌ها نوشتیم، به هر فایل یک شناسه guid می‌دهد. ساختار این شناسه مانند نمونه زیر است:


۶۱۰bcccb-9630-4c77-93b8-30bba2e4ce98

قسمت مربوط به آپلود فایل ها و تخصیص شناسه یکتا به آنها  در آموزش قبل به همراه نمونه کد توضیح داده شد. با توجه به آن آموزش فایل download.php می تواند نمونه کدی مانند زیر داشته باشد:


include 'GUID.php';
function DownloadFile($id){
  $con=mysqli_connect("localhost","user","pass","database");
  // Check connection

  if(mysqli_connect_errno()) {
  return "Failed to connect to MySQL: " . mysqli_connect_error();
  }
  $gid= strip_tags($id);
  $sql= "SELECT filename From myfiles WHERE FileLink=$gid";
  $result = mysqli_query($con, $sql);
  if (mysqli_num_rows($result)>0) {
    $row = mysqli_fetch_assoc($result)
    mysqli_close($con);
    $file = 'uploads/'. $row['filename'];
    if (file_exists($file)){
      header('Content-Description: File Transfer');
      header('Content-Type:application/octet-stream');
      header('Content-Disposition: attachment;filename="'.basename($file).'"');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma:public');
      header('Content-Length:'.filesize($file));
      readfile($file);
      exit;
    }
  }
}

موفق و پیروز باشید…

4 دیدگاه دربارهٔ «لینک غیر مستقیم برای فایل ها در PHP – بخش دوم;

  1. سلام باتشکر از اموزش خوبتون من همه مراحل رو انجام دادم و کد
    include ‘GUID.php’;
    function DownloadFile($id){
    $con=mysqli_connect(“localhost”,”user”,”pass”,”database”);
    // Check connection

    if(mysqli_connect_errno()) {
    return “Failed to connect to MySQL: ” . mysqli_connect_error();
    }
    $gid= strip_tags($id);
    $sql= “SELECT filename From myfiles WHERE FileLink=$gid”;
    $result = mysqli_query($con, $sql);
    if (mysqli_num_rows($result)>0) {
    $row = mysqli_fetch_assoc($result)
    mysqli_close($con);
    $file = ‘uploads/’. $row[‘filename’];
    if (file_exists($file)){
    header(‘Content-Description: File Transfer’);
    header(‘Content-Type:application/octet-stream’);
    header(‘Content-Disposition: attachment;filename=”‘.basename($file).'”‘);
    header(‘Expires: 0’);
    header(‘Cache-Control: must-revalidate’);
    header(‘Pragma:public’);
    header(‘Content-Length:’.filesize($file));
    readfile($file);
    exit;
    }
    }
    }
    رو در فایل download.php
    قرار دادم ولی بعدش ارور ۵۰۰ میده در ضمن من تگ های اضافه کردم چون بدون اینا فقط کدهارو نمایش میداد لطفا راهنمایی کنید باتشکر

  2. سلام وقت بخیر
    من میخوام فایل هایی که در هاست دانلودم هست ،لینکهای دانلود غیر مستقیم انجام بشه، برای اینکار طبق آموزشتون دسترسی httacess رو deny from all قرار دادم و فایل ها رو به صورت دستی اپلود کرد، الان چطوری میتونم این کدتون رو در هاست دانلود استفاده کنم ، با تشکر

    1. با سلام،
      چند سوال دارم از خدمتتون که جوابشون باعث میشه راحت‌تر بتونم کمکتون کنم.
      روی هاست دانلودتون، دیتابیس MySQL دارید؟
      جدولی که در آموزش اول گفتیم رو ساختید و با آپلود کردن فایل‌ها‌تون توسط فایل save.php توی دیتابیس رکوردهای مربوطه ثبت میشن؟

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *