指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
symfony7之UploadedFile上传的原理
UploadedFile 类是 Symfony\Component\HttpFoundation\File\UploadedFile,查勘表源码可以看到它的move方法是对 php 原生的 move_uploaded_file 方法的封装.

//UploadedFile中 move 方法的核心部分如下
$moved = move_uploaded_file($this->getPathname(), $target); // php内置的这个函数,如果目标文件已经存在,将会被覆盖。
@chmod($target, 0666 & ~umask()); // 这个是给新路径下的文件赋权限rw-rw-rw-rw, umask()是系统当前的 权限掩码, 这是标准写法,用来根据系统设置自动“减去”被屏蔽的权限。0666 是 八进制, 前面加个0和666十进制区分

在 PHP(和 C、JavaScript 等许多语言)中,前缀 0 表示“八进制”,就像:
0x 表示十六进制(例如 0xFF 是 255)
0b 表示二进制(例如 0b1010 是 10)
0 表示八进制(例如 0666 是权限)

//php 默认前端上传的内容存放到了 /tmp下,格式如 pathname: "/tmp/phpRj5h4q"
但是请求完了之后,这个/tmp下的文件会被清除,所以我们需要在上传的逻辑里调用 move 方法,存到新的位置,后续继续处理(使用)

而UploadedFile 又继承自 File
class UploadedFile extends File
而File又继承自 PHP 内置的 \SplFileInfo 类
class File extends \SplFileInfo

为什么这样设计?
\SplFileInfo 是 PHP 标准库(SPL)中的一个类,专门用来处理文件和目录的相关信息,比如文件名、路径、大小、修改时间等等。
Symfony 利用继承它,复用它提供的丰富文件操作接口,避免重复造轮子。
File 类在此基础上封装了更多功能(比如文件验证、路径处理等)。
UploadedFile 又继承 File,专门增加了针对 HTTP 上传文件的逻辑,比如错误码、临时文件路径、移动文件的方法。

\SplFileInfo 提供的常用方法(被 File 和 UploadedFile 继承):
getFilename() — 获取文件名(带扩展名)
getBasename() — 获取文件名(可去掉扩展名)
getPath() — 获取文件目录路径
getPathname() — 获取完整路径(绝对路径)
getExtension() — 获取扩展名
getSize() — 获取文件大小
getMTime() — 获取最后修改时间
isDir()、isFile() — 判断是否为目录或文件

Symfony 额外扩展的方法:
File 和 UploadedFile 增加了上传文件相关的:
getClientOriginalName() — 客户端上传时的原始文件名
getClientOriginalExtension() — 客户端文件扩展名
move() — 将临时文件移动到目标目录
isValid() — 判断文件上传是否成功
上传错误处理等