我有同樣的問題。代碼執行「exists」方法失敗。經過一天的調試和研究,我發現article不是調用靜態方法作者直接從'客戶端'獲取URL。這種方法促使我重寫一些代碼。
我的舊代碼:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
return Storage::exists($path) ? Storage::url($path) : $default;
}
新版本:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
/**
* @var $storage FilesystemAdapter
*/
$storage = Storage::disk('s3');
return $storage->getDriver()->has($path)
? $storage->url($path)
: $default;
}
更新:在一些地方(有更深層次的嵌套)的代碼,新版本還沒有工作。據我所知,代碼應該有儘可能少的嵌套層次的代碼(類,函數)。所以爲了使它工作,我再次用少嵌套重寫它:
/**
* Check if file exists in storage and return full URL or $default value.
*
* @param $path
* @param string $default
* @return string
*/
public static function getStorageUrl($path, $default = '')
{
/**
* @var $storage FilesystemAdapter
* @var $adapter AwsS3Adapter
* @var $client S3Client
*/
$storage = Storage::disk('s3');
$adapter = $storage->getDriver()->getAdapter();
$client = $adapter->getClient();
return $adapter->has($path)
? $client->getObjectUrl(env('S3_BUCKET'), $path)
: $default;
}