php stortime,文件存储 | 综合话题 | Laravel 5.3 中文文档
文件存儲
由 學院君 創建于4年前, 最后更新于 11個月前
版本號 #2
29460 views
6 likes
0 collects
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創建一個軟鏈接。
文件元信息
除了讀寫文件之外,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;
//?Automatically?calculate?MD5?hash?for?file?name...
Storage::putFile('photos',?new?File('/path/to/photo'));
//?Manually?specify?a?file?name...
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方法即可:
namespace?App\Http\Controllers;
use?Illuminate\Http\Request;
use?App\Http\Controllers\Controller;
class?UserAvatarController?extends?Controller
{
/**
*?Update?the?avatar?for?the?user.
*
*?@param? Request? $request
*?@return?Response
*/
public?function?update(Request?$request)
{
$path?=?$request->file('avatar')->store('avatars');
return?$path;
}
}
這里有一些需要注意的重要事項,在這里我們只指定了目錄名,而不是文件名。默認情況下,store方法會基于文件內容自動生成文件名,這通過對文件內容進行MD5實現。store方法會返回文件路徑以便在數據庫中保存文件路徑和文件名。
你還可以調用Storage門面上的putFile方法來執行與上例同樣的文件操作:
$path?=?Storage::putFile('avatars',?$request->file('avatar'));
注:如果你接收的上傳文件尺寸很大,你可能需要手動指定文件名,因為計算大文件的MD5哈希值很耗內存。
指定文件名
如果你不想要自動生成文件名,可以使用storeAs方法,該方法接收路徑、文件名以及磁盤(可選)作為參數:
$path?=?$request->file('avatar')->storeAs(
'avatars',?$request->user()->id
);
當然,你還可以使用Storage門面上的putFileAs方法,該方法與上面的方法實現同樣的操作:
$path?=?Storage::putFileAs(
'avatars',?$request->file('avatar'),?$request->user()->id
);
指定磁盤
默認情況下,store方法會使用默認的磁盤,如果你想要指定其它磁盤,傳遞磁盤名稱作為store方法的第二個參數即可:
$path?=?$request->file('avatar')->store(
'avatars/'.$request->user()->id,?'s3'
);
文件能見度
在Laravel的Flysystem集成中,“能見度”是對不同平臺上文件權限的抽象,文件可以被聲明成public或private,當文件被聲明為public,意味著文件可以被其他人訪問。例如,使用S3時,可以獲取public文件的URL。
使用put方法設置文件的時候可以順便設置能見度:
use?Illuminate\Support\Facades\Storage;
Storage::put('file.jpg',?$contents,?'public');
如果文件已經被存儲,能見度可以通過getVisibility和setVisibility方法獲取和設置:
$visibility?=?Storage::getVisibility('file.jpg');
Storage::setVisibility('file.jpg',?'public');
6、刪除文件
delete?方法接收單個文件名或多個文件數組并將其從磁盤移除:
use?Illuminate\Support\Facades\Storage;
Storage::delete('file.jpg');
Storage::delete(['file1.jpg',?'file2.jpg']);
7、目錄
獲取一個目錄下的所有文件
files方法返回給定目錄下的所有文件數組,如果你想要獲取給定目錄下包含子目錄的所有文件列表,可以使用allFiles方法:
use?Illuminate\Support\Facades\Storage;
$files?=?Storage::files($directory);
$files?=?Storage::allFiles($directory);
獲取一個目錄下的所有子目錄
directories方法返回給定目錄下所有目錄數組,此外,可以使用allDirectories方法獲取嵌套的所有子目錄數組:
$directories = Storage::directories($directory);
// 遞歸...
$directories = Storage::allDirectories($directory);
創建目錄
makeDirectory方法將會創建給定目錄,包含子目錄(遞歸):
Storage::makeDirectory($directory);
刪除目錄
最后,deleteDirectory方法用于移除目錄,包括該目錄下的所有文件:
Storage::deleteDirectory($directory);
8、自定義文件系統
Laravel 的Flysystem集成支持自定義驅動,為了設置自定義的文件系統,你需要創建一個服務提供者如DropboxServiceProvider。在該提供者的boot方法中,你可以使用Storage門面的extend方法定義自定義驅動:
namespace App\Providers;
use Storage;
use League\Flysystem\Filesystem;
use Dropbox\Client as DropboxClient;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Dropbox\DropboxAdapter;
class DropboxServiceProvider extends ServiceProvider{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Storage::extend('dropbox', function($app, $config) {
$client = new DropboxClient(
$config['accessToken'], $config['clientIdentifier']
);
return new Filesystem(new DropboxAdapter($client));
});
}
/**
* Register bindings in the container.
*
* @return void
*/
public function register()
{
//
}
}
extend方法的第一個參數是驅動名稱,第二個參數是獲取$app和$config變量的閉包。該解析器閉包必須返回一個League\Flysystem\Filesystem實例。$config變量包含了定義在配置文件config/filesystems.php中為特定磁盤定義的選項。
創建好注冊擴展的服務提供者后,就可以使用配置文件config/filesystem.php中的dropbox驅動了。
總結
以上是生活随笔為你收集整理的php stortime,文件存储 | 综合话题 | Laravel 5.3 中文文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用上比亚迪刀片电池续航不再拉胯!一汽丰田
- 下一篇: php删除框架集,delete 删除-M