22、Hyperf 3 快速使用 - Hyperf 3 上传文件 or 图片到阿里云
hi,我是温新,一名 PHPer
Hypref 版本:Hyperf 3.0
学习目标:掌握上传文件 or 图片到阿里云
本篇文章学习的是将文件上传到阿里云。在此之前需要准备好阿里云的对象存储空间。
准备工作
第一步:安装组件
composer require hyperf/filesystem
composer require hyperf/flysystem-oss
第二步:生成配置文件
php bin/hyperf.php vendor:publish hyperf/filesystem
该命令会在 config/autoload
目录下生成 file.php
文件,其中关于七牛云的配置如下:
'oss' => [
'driver' => \Hyperf\Filesystem\Adapter\AliyunOssAdapterFactory::class,
'accessId' => env('OSS_ACCESS_ID'),
'accessSecret' => env('OSS_ACCESS_SECRET'),
'bucket' => env('OSS_BUCKET'),
'endpoint' => env('OSS_ENDPOINT'),
// 'timeout' => 3600,
// 'connectTimeout' => 10,
// 'isCName' => false,
// 'token' => null,
// 'proxy' => null,
],
第三步:.env
文件中填写配置
OSS_ACCESS_ID=你的阿里云 key
OSS_ACCESS_SECRET=你的阿里云 secret
OSS_BUCKET=你的阿里云 bucket
OSS_ENDPOINT=你的阿里云 endpoint
第四步:创建控制器
<?php
namespace App\Controller\Test;
use Hyperf\HttpServer\Annotation\Controller;
#[Controller]
class OssUploadController
{
}
上传图片到阿里云
方法一:通过实例方式上传
通过案例快速体验上传图片到阿里云
#[PostMapping('/oss/store')]
public function store()
{
// 实例化容器对象
$container = ApplicationContext::getContainer();
// 实例 Config 配置对象,并获取 file.php 配置文件内容
$options = $container->get(ConfigInterface::class)->get('file');
// 获取文件工厂实例
$filesystemFactory = $container->get(FilesystemFactory::class);
// 获取阿里云实例对象
$adapter = $filesystemFactory->getAdapter($options, 'oss');
$path = 'a.jpg';
if ($adapter->fileExists('hyperf/' . $path)) {
// 文件已上传则返回文件大小
return $adapter->fileSize('hyperf/' . $path)->fileSize();
}
// 上传图片
$adapter->writeStream($path, fopen($path, 'r'), new Config());
// 返回图片大小
return $adapter->fileSize('hyperf/' . $path)->fileSize();
}
方法二:使用依赖注入
1、通过 Hyperf\Filesystem\FilesystemFactory;
实现
第一步:控制器
<?php
namespace App\Controller\Test;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Contract\ContainerInterface;
use Hyperf\Filesystem\FilesystemFactory;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Hyperf\HttpServer\Annotation\PostMapping;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\Utils\ApplicationContext;
use Hyperf\View\RenderInterface;
use League\Flysystem\Config;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemAdapter;
#[Controller]
class OssUploadController
{
protected FilesystemAdapter $adapter;
public function __construct(protected ContainerInterface $container, $adapterName = 'oss')
{
$this->adapter = $this->getAdapter($adapterName);
}
public function getAdapter($adapterName)
{
$options = $this->container->get(ConfigInterface::class)->get('file');
$filesystemFactory = $this->container->get(FilesystemFactory::class);
return $filesystemFactory->getAdapter($options, $adapterName);
}
#[GetMapping('/oss/create')]
public function create(RenderInterface $render)
{
return $render->render('alioss.create');
}
#[PostMapping('/oss/store')]
public function store(RequestInterface $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$newFilename = 'hyperf/' . date('YmdHis') . uniqid() . '.' . $file->getExtension();
$stream = fopen($file->getRealPath(), 'r');
$this->adapter->writeStream($newFilename, $stream, new Config());
return $this->adapter->fileSize($newFilename)->fileSize();
}
}
}
第二步:视图文件
<!-- storage/view/oss/create.blade.php -->
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hyperf 3 上传图片</title>
</head>
<body>
<form action="/oss/store" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传图片">
</form>
</body>
</html>
2、使用 \League\Flysystem\Filesystem $filesystem
对象实现
这一步只修改修改控制器对的方法即可,如下:
<?php
namespace App\Controller\Test;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Contract\ContainerInterface;
use Hyperf\Filesystem\FilesystemFactory;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Hyperf\HttpServer\Annotation\PostMapping;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\Utils\ApplicationContext;
use Hyperf\View\RenderInterface;
use League\Flysystem\Config;
use League\Flysystem\Filesystem;
use League\Flysystem\FilesystemAdapter;
#[Controller]
class OssUploadController
{
protected FilesystemAdapter $adapter;
// 改动
protected $filesystem;
public function __construct(protected ContainerInterface $container, $adapterName = 'oss')
{
$this->adapter = $this->getAdapter($adapterName);
// 改动
$this->filesystem = new Filesystem($this->adapter);
}
public function getAdapter($adapterName)
{
$options = $this->container->get(ConfigInterface::class)->get('file');
$filesystemFactory = $this->container->get(FilesystemFactory::class);
return $filesystemFactory->getAdapter($options, $adapterName);
}
#[GetMapping('/oss/create')]
public function create(RenderInterface $render)
{
return $render->render('alioss.create');
}
#[PostMapping('/oss/store')]
public function store(RequestInterface $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$newFilename = 'hyperf/' . date('YmdHis') . uniqid() . '.' . $file->getExtension();
$stream = fopen($file->getRealPath(), 'r');
// 改动
$this->filesystem->writeStream($newFilename, $stream);
return $this->filesystem->fileSize($newFilename);
}
}
}
文件上云是一个常用功能。
请登录后再评论