天天看點

php lumen擷取檔案流,Laravel5.4檔案存儲(操作檔案)

1、簡介

Laravel 基于 Frank de Jonge 開發的 PHP 包 Flysystem 提供了強大的檔案系統抽象。Laravel 檔案系統內建對使用驅動處理本地檔案系統進行了簡化,這些驅動包括Amazon S3,以及 Rackspace 雲存儲。此外,在這些存儲選項間切換非常簡單,因為對不同系統而言,API 是一緻的。

2、配置

檔案系統配置檔案位于 config/filesystems.php。在該檔案中可以配置所有“磁盤”,每個磁盤描述了特定的存儲驅動和存儲位置。該配置檔案為每種支援的驅動提供了示例配置,是以,簡單編輯該配置來應用你的存儲參數和認證資訊即可。

當然,你想配置多少磁盤就配置多少,多個磁盤也可以共用同一個驅動。

公共磁盤

public 磁盤用于存儲可以被公開通路的檔案,預設情況下, public 磁盤使用 local 驅動并将檔案存儲在 storage/app/public ,要讓這些檔案可以通過web 通路到,需要建立一個軟鍊 public/storage 指向 storage/app/public ,這種方式可以将公開通路的檔案儲存在一個可以很容易被不同部署環境共享的目錄,在使用零停機時間部署系統如Envoyer 的時候尤其友善。

要建立這個軟鍊,可以使用 Artisan 指令 storage:link :php artisan storage:link

檔案被存儲并且軟鍊已經被建立的情況下,就可以使用輔助函數 asset 建立一個指向該檔案的URL:echo asset('storage/file.txt');

本地驅動

使用 local 驅動的時候,所有的檔案操作都相對于定義在配置檔案中的 root 目錄,預設情況下,該值設定為 storage/app 目錄,是以,下面的方法将會存儲檔案到storage/app/file.txt:Storage::disk('local')->put('file.txt', 'Contents');

驅動預備知識

Composer包

在使用 Amazon S3 或 Rackspace 驅動之前,需要通過Composer 安裝相應的包:Amazon S3: league/flysystem-aws-s3-v3 ~1.0

Rackspace: league/flysystem-rackspace ~1.0

S3驅動配置

S3 驅動配置資訊位于配置檔案 config/filesystems.php ,該檔案包含 S3 驅動的示例配置數組。你可以使用自己的 S3 配置和認證資訊自由編輯該數組。

FTP驅動配置

Laravel 的檔案系統內建了 FTP 操作,不過,架構預設的配置檔案 filesystems.php 并沒有提供示例配置。如果你需要配置一個FTP檔案系統,可以使用以下示例配置:'ftp' => [

'driver'   => 'ftp',

'host'     => 'ftp.example.com',

'username' => 'your-username',

'password' => 'your-password',

// Optional FTP Settings...

// 'port'     => 21,

// 'root'     => '',

// 'passive'  => true,

// 'ssl'      => true,

// 'timeout'  => 30,

],

Rackspace驅動配置

Laravel 的 Flysystem 還內建了 Rackspace ,同樣,預設配置檔案 filesystems.php 也沒有提供對應的示例配置,如果你需要配置Rackspace 檔案系統,可以使用以下示例配置:'rackspace' => [

'driver'    => 'rackspace',

'username'  => 'your-username',

'key'       => 'your-key',

'container' => 'your-container',

'endpoint'  => 'https://identity.api.rackspacecloud.com/v2.0/',

'region'    => 'IAD',

'url_type'  => 'publicURL',

],

3、擷取硬碟執行個體

Storage 門面用于和你配置的任意磁盤進行互動,例如,你可以使用該門面上的 put 方法來存儲頭像到預設磁盤,如果你調用 Storage 門面上的方法而沒有調用 disk 方法,則調用的方法會自動被傳遞到預設磁盤:use Illuminate\Support\Facades\Storage;

Storage::put('avatars/1', $fileContents);

與多個磁盤進行互動時,可以使用Storage 門面上的 disk 方法通路特定磁盤:Storage::disk('s3')->put('avatars/1', $fileContents);

4、擷取檔案

get 方法用于擷取給定檔案的内容,該方法将會傳回該檔案的原生字元串内容。需要注意的是,所有檔案路徑都是相對于配置檔案中指定的磁盤預設根目錄:$contents = Storage::get('file.jpg');

exists 方法用于判斷給定檔案是否存在于磁盤上:$exists = Storage::disk('s3')->exists('file.jpg');

檔案URL

使用 local 或 s3 驅動時,可以使用 url 方法擷取給定檔案的URI。如果你使用的是 local 驅動,通常會在給定路徑前加上 /storage,并傳回該檔案的相對URL;如果使用的是 s3 驅動,則會傳回完整的遠端URL:use Illuminate\Support\Facades\Storage;

$url = Storage::url('file1.jpg');注:記住,如果你在使用 local 驅動,所有需要公開通路的檔案都應該存放在 storage/app/public 目錄下,此外,你還需要為 storage/app/public 建立一個軟連結。

自定義本地主機URL

如果你想要預定義使用 local 驅動磁盤存放檔案的主機,可以添加 url 選項到磁盤配置數組:'public' => [

'driver' => 'local',

'root' => storage_path('app/public'),

'url' => env('APP_URL').'/storage',

'visibility' => 'public',

],

檔案元資訊

除了讀寫檔案之外,Laravel 還可以提供檔案本身的資訊。例如,size 方法可用于以位元組方式傳回檔案大小:use Illuminate\Support\Facades\Storage;

$size = Storage::size('file1.jpg');

lastModified 方法以 UNIX 時間戳

格式傳回檔案最後一次修改時間:$time = Storage::lastModified('file1.jpg');

5、存儲檔案

put 方法可用于存儲原生檔案内容到磁盤。此外,還可以傳遞一個PHP資源到 put 方法,該方法将會使用 Flysystem 底層的流支援。在處理大檔案的時候推薦使用檔案流:use Illuminate\Support\Facades\Storage;

Storage::put('file.jpg', $contents);

Storage::put('file.jpg', $resource);

自動檔案流

如果你想要 Laravel 自動将給定檔案流輸出到對應存儲路徑,可以使用putFile 或 putFileAs 方法,該方法接收 Illuminate\Http\File 或 Illuminate\Http\UploadedFile 執行個體,然後自動将檔案流儲存到期望的路徑:use Illuminate\Http\File;

// 自動計算檔案名的MD5值...

Storage::putFile('photos', new File('/path/to/photo'));

// 手動指定檔案名...

Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

這裡有一些關于 putFile 方法的重要注意點,注意到我們隻指定了目錄名,預設情況下,putFile 方法會基于檔案内容自動生成檔案名。實作原理是對檔案内容進行MD5哈希運算。putFile 方法會傳回檔案路徑,包括檔案名,以便于在資料庫中進行存儲。

putFile 和 putFileAs 方法還接收一個用于指定存儲檔案“能見度”的參數,這在你将檔案存儲到雲存儲(如S3)平台并期望檔案可以被公開通路時很有用:Storage::putFile('photos', new File('/path/to/photo'), 'public');

添加内容到檔案開頭/結尾

prepend 和 append 方法允許你輕松插入内容到檔案開頭/結尾:Storage::prepend('file.log', 'Prepended Text');

Storage::append('file.log', 'Appended Text');

拷貝 & 移動檔案

copy 方法将磁盤中已存在的檔案從一個地方拷貝到另一個地方,而move 方法将磁盤中已存在的檔案從一定地方移到到另一個地方:Storage::copy('old/file1.jpg', 'new/file1.jpg');

Storage::move('old/file1.jpg', 'new/file1.jpg');

檔案上傳

在 Web 應用中,最常見的存儲檔案案例就是存儲使用者上傳的檔案,如使用者頭像、照片和文檔等。Laravel 通過使用上傳檔案執行個體上的 store 方法讓存儲上傳檔案變得簡單。你隻需要傳入上傳檔案儲存的路徑并調用 store 方法即可:<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Controllers\Controller;

class UserAvatarController extends Controller

{

public function update(Request $request)

{

$path = $request->file('avatar')->store('avatars');

return $path;

}

}

這裡有一些需要注意的重要事項,在這裡我們隻指定了目錄名,而不是檔案名。預設情況下,store 方法會基于檔案内容自動生成檔案名,這通過對檔案内容進行MD5實作。store 方法會傳回檔案路徑以便在資料庫中儲存檔案路徑和檔案名。