FTP یا همان  File Transfer Protocol پروتکلی است که جهت انتقال فایل در شبکه استفاده میشود و بر اساس معماری client-server طراحی شده است .
با استفاده از این پروتکل به راحتی میشود فایل ها را در یک سرور دیگری غیر از سرور local آپلود ، نگه داری و استفاده نمود.
پکیج filesystem یکی از پکیج های قدرتمند لاراول میباشد که به وسیله آن میتوان عملیات FTP را مدیریت کرد .
این پکیج از درایورهایی مانند Amazon S3 ، Rackspace Cloud ، FTP پشتیبانی میکند .
FTP به صورت پیش فرض در کلاس filesystem لاراول پیکره بندی نشده است و برای پیکره بندی درایور FTP باید به مسیر config/filesystems.php رفته و FTP را کانفیگ کنید .
'ftp' => [
    'driver'   => 'ftp',
    'host'     => 'ftp_server.addserss.com',
    'username' => 'ftp-server-username',
    'password' => 'ftp-server-password',
    'root'     => 'ftp_server_uploads_directory',   
    // گزینه های اختیاری
    // 'port'     => 21,
    // 'passive'  => true,
    // 'ssl'      => true,
    // 'timeout'  => 30,
],​


برای آپلود فایل به سرور FTP به صورت زیر عمل میکنیم . به عنوان مثال میخواهیم یک فایل به نام video1.mp4 را از طریق FTP آپلود نماییم .
این کار را به روش های مختلفی میتوان انجام داد .

namespace App\Http\Controllers;


use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Storage;

class FTPUploadController extends Controller
{
   /*************************** روش اول *******************************/
   public function put(Request $request) 
   {
      if($request->hasFile('video1.mp4'))
       {
       $videoFile = $request->file('video1.mp4')->getClientOriginalName();
       Storage::disk('ftp')->put($videoFile, fopen($request->file('video1.mp4'), "r+"));
       }
   }

  /*************************** روش دوم *******************************/
   public function putFile(Request $request) 
   {
      if($request->hasFile('video1.mp4'))
       {
         Storage::putFile("video_dir",$request->file('internal_file_path'));
       }
   }


  /*************************** روش سوم *******************************/
   public function store(Request $request) 
   {
      if($request->hasFile('video1.mp4'))
       {
          $request->file('video1.mp4')->store('video_dir', 'ftp');
       }
   }
}


برای دانلود فایل از سرور و  یا هاست FTP هم میشود از طریق زیر عمل کرد .

function downloadByFTP(){
         $ftp = Storage::createFtpDriver([
                   'driver'   => 'ftp',
                   'host'     => 'ftp_server.addserss.com',
                   'username' => 'ftp-server-username',
                   'password' => 'ftp-server-password',
                   'root'     => 'ftp_server_uploads_directory',
                    // گزینه های اختیاری
                    // 'port'     => 21,
                    // 'passive'  => true,
                    // 'ssl'      => true,
                    // 'timeout'  => 30,
          ]); 
            // خواندن محتوای فایل 
           $filecontent = $ftp->get("video_dir/video1.mp4");
           return Response::make($filecontent, '200', array(
                'Content-Type' => 'application/octet-stream',
                'Content-Disposition' => 'attachment; filename=video1.mp4'
            ));
}
      /*****  برای دانلود فایل از راه های دیگر مانند راه زیر هم میشود استفاده کرد ****/
     
function download(){
  return Storage::download("video_dir/video1.mp4");
}


حذف فایل از طریق FTP : 

function remove(){
   Storage::delete('video1.mp4');
  /****** راه دوم ***/
  Storage::disk('ftp')->delete('video1.mp4');
}


حجم فایل (این تابع حجم فایل را به صورت بایت نشان میدهد):

echo Storage::size('video_dir/video1.mp4');


لیست کردن دایرکتوری های سرور FTP , این تابع آرایه ای از نام دایرکتوری ها را نشان میدهد .

$dir = \Storage::disk("ftp")->directories("video_dir");

print_r($dir);