نماد سایت امپراطوری من

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

لینک غیر مستقیم برای فایل ها در 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;
    }
  }
}

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

خروج از نسخه موبایل