ดาวน์โหลดไฟล์ text จากฐานข้อมูล

ตัวอย่างการดาวน์โหลดไฟล์ text จากข้อมูลในฐานข้อมูล สามารถประยุกต์ใช้ในการดาวน์โหลดไฟล์ประเภทใดก็ได้

อันดับแรก สร้างลิงค์สำหรับดาวน์โหลดไฟล์ ชี้ไปที่ไฟล์ download.php ซึ่งสามารถสร้างด้วยวิธีใดก็ได้นะครับ ตัวอย่างนี้เป็นการแสดงให้เห็นการสร้างลิงค์ไปที่ไฟล์ download.php เฉยๆ
<a href="download.php?id=1">Download</a>

เสร็จแล้วสร้างไฟล์ download.php มีโค้ดตามด้านล่างนี่แหละครับ
<?php
/**
 * @filesource download.php.
 *
 * @author Goragod Wiriya <admin@goragod.com>
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */

/**
 * 0 (default )บันทึกข้อผิดพลาดร้ายแรงลง error_log .php
 * 1 บันทึกข้อผิดพลาดและคำเตือนลง error_log .php
 * 2 แสดงผลข้อผิดพลาดและคำเตือนออกทางหน้าจอ (ใช้เฉพาะตอนออกแบบเท่านั้น)
 */

define('DEBUG', 2);

/**
 * false (default)
 * true บันทึกการ query ฐานข้อมูลลง log (ใช้เฉพาะตอนออกแบบเท่านั้น)
 */

define('DB_LOG', false);

// load Kotchasan
include 'Kotchasan/load.php';
// Initial Kotchasan Framework
$req = Kotchasan::createWebApplication();
$req->defaultController = 'Index\Download\Controller';
$req->run();

ไฟล์นี้จะมีเนื้อหาเหมือนกับไฟล์ index.php ปกติแหละครับ เพียงแต่มีสิ่งที่เพิ่มเติมขึ้นมาคือการกำหนด defaultController ไปยัง Index\Download\Controller แทนค่า default ซึ่งปกติจะเป็นของหน้าหลักอยู่

สำหรับคลาส Index\Download\Controller คือไฟล์ modules/index/controllers/download.php มีโค้ดตามด้านล่าง คลาสนี้จะทำการอ่านข้อมูลที่เลือกจาก Model และทำการส่งออกเป็นไฟล์ดาวน์โหลดด้วยการกำหนด header เป็น application/octet-stream ด้วย Response คลาส
<?php
/**
 * @filesource modules/index/controllers/download.php
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */


namespace Index\Download;

use \Kotchasan\Http\Request;
use \Kotchasan\Http\Response;

/**
 * default Controller
 *
 * @author Goragod Wiriya <admin@goragod.com>
 *
 * @since 1.0
 */

class Controller extends \Kotchasan\Controller
{

  /**
   * คลาสสำหรับดาวน์โหลดไฟล์
   *
   * @param Request $request
   */

  public function index(Request $request)
  {
    // รับค่าจาก $_GET['id']
    $id = $request->get('id')->toInt();
    // อ่านข้อมูลจากฐานข้อมูล
    $download = \Index\Download\Model::get($id);
    // create Response
    $res = new Response();
    // set headers
    $res->withHeaders(array(
        'Content-Type' => 'application/octet-stream',
        'Content-disposition' => 'attachment; filename='.$download->name
      ))
      // set file contents จากคอลัมน์ text ของฐานข้อมูล
      ->withContent($download->text)
      // create download file
      ->send();
  }
}

ไฟล์สุดท้ายที่เกี่ยวข้องคือ Model สำหรับอ่านข้อมูลจากฐานข้อมุล Index\Download\Model หรือไฟล์ modules/index/models/download.php
<?php
/**
 * @filesource modules/index/models/download.php
 * @link http://www.kotchasan.com/
 * @copyright 2016 Goragod.com
 * @license http://www.kotchasan.com/license/
 */


namespace Index\Download;

/**
 * โมเดลสำหรับใช้งานร่วมกับฐานข้อมูล
 *
 * @author Goragod Wiriya <admin@goragod.com>
 *
 * @since 1.0
 */

class Model extends \Kotchasan\Model
{

  /**
   * เมธอดอ่านข้อมูลที่ต้องการดาวน์โหลดจากฐานข้อมูล
   *
   * @param int $id
   * @return object|bool คืนค่า object ของข้อมูล ไม่พบคืนค่า false
   */

  public static function get($id)
  {
    // create Model
    $model = new static;
    // SELECT * FROM `download` WHERE `id`=$id LIMIT 1
    return $model->db()->first($model->getTableName('download'), $id);
  }
}


สำหรับโครงสร้างของฐานข้อมูล download ตามตัวอย่างนี้จะเก็บข้อมูลประมาณนี้
`id` (INT) `text` (TEXT) `name` (VARCHAR)
1 ข้อมูลในไฟล์ text text.txt
0SHAREFacebookLINE it!