要让laravel支持百度网盘等非原生存储后端,必须手动注册flysystem适配器并重写磁盘解析逻辑;需在appserviceprovider的boot()中调用storage::extend()注册baidu_pan驱动,创建继承abstractadapter的baidupanadapter适配器,配置filesystems.php和.env,并清空配置缓存。

要让Laravel支持百度网盘、MinIO、OSS等非原生存储后端,必须突破Flysystem默认驱动限制,手动注册适配器并重写磁盘解析逻辑——这一步不做,Storage::disk('baidu')会直接抛出DiskNotFoundException。
注册自定义Flysystem适配器
进入app/Providers/AppServiceProvider.php的boot()方法,在末尾插入以下代码:
use League\Flysystem\Filesystem;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Adapter\Local as LocalAdapter;
use League\Flysystem\Adapter\NullAdapter;
use YourApp\Adapters\BaiduPanAdapter;
Storage::extend('baidu_pan', function ($app, $config) {
return new Filesystem(new BaiduPanAdapter(
$config['client_id'],
$config['client_secret'],
$config['access_token']
));
});
注意:extend()必须在boot()中调用,不能放在register()里,否则Storage门面尚未初始化,会报Call to a member function extend() on null。
创建百度网盘专用适配器类
在app/Adapters/BaiduPanAdapter.php中新建类:
namespace YourApp\Adapters;
use League\Flysystem\Adapter\AbstractAdapter;
use League\Flysystem\Config;
use GuzzleHttp\Client;
class BaiduPanAdapter extends AbstractAdapter
{
protected $client;
protected $accessToken;
public function __construct($clientId, $clientSecret, $accessToken)
{
$this->client = new Client(['base_uri' => 'https://pan.baidu.com/rest/2.0/']);
$this->accessToken = $accessToken;
}
public function write($path, $contents, Config $config)
{
$response = $this->client->post('file/upload', [
'form_params' => [
'access_token' => $this->accessToken,
'path' => '/apps/' . config('app.name') . '/' . $path,
'file' => $contents,
]
]);
return json_decode($response->getBody(), true);
}
public function read($path)
{
// 实现下载逻辑,调用/2.0/file/download接口
throw new \BadMethodCallException('read not implemented');
}
}
这个适配器不继承LocalAdapter或S3Adapter,而是直接继承AbstractAdapter——因为百度网盘API与标准S3协议完全不兼容,强行套用会导致签名失败或401错误。
配置多模态磁盘并启用MIME路由
第一步:在config/filesystems.php的disks数组末尾追加:
'baidu_pan' => [
'driver' => 'baidu_pan',
'client_id' => env('BAIDU_CLIENT_ID'),
'client_secret' => env('BAIDU_CLIENT_SECRET'),
'access_token' => env('BAIDU_ACCESS_TOKEN'),
],
第二步:在.env中补全凭证(务必使用OAuth2.0获取的长期access_token,不是code):
BAIDU_CLIENT_ID=xxxxx
BAIDU_CLIENT_SECRET=yyyyy
BAIDU_ACCESS_TOKEN=zzzzz_zzzzz
第三步:在app/Services/FileStorageService.php中编写路由逻辑:
public function storeByType(UploadedFile $file): string
{
$mimeType = $file->getMimeType();
if (str_starts_with($mimeType, 'image/')) {
return Storage::disk('local_images')->putFile('images', $file);
} elseif (str_starts_with($mimeType, 'video/')) {
return Storage::disk('s3_videos')->putFile('videos', $file);
} elseif (in_array($mimeType, ['application/pdf', 'application/msword'])) {
return Storage::disk('baidu_pan')->write(
$file->getClientOriginalName(),
file_get_contents($file),
new Config()
);
}
throw new InvalidArgumentException("Unsupported mime type: {$mimeType}");
}
【必须先清空配置缓存】执行php artisan config:clear,否则新注册的baidu_pan驱动永远不会被加载。











