Laravel接收Postman上传文件时临时文件查找及移动报错问题
Laravel上传临时文件找不到问题解答
关于临时文件名与原文件名不一致的问题
这是PHP核心的正常运行机制,不属于错误:
- PHP处理HTTP上传文件时,会自动给临时目录下的上传文件生成随机文件名(格式为
php+随机字符串.tmp),不会保留用户上传的原始文件名。该设计是为了避免临时目录文件名冲突,同时防范恶意构造文件名引发的路径遍历攻击。 - 你在Postman中设置的原始上传文件名不会丢失,可以通过
$_FILES["file"]["name"]读取,在Laravel中更推荐用$request->file('file')->getClientOriginalName()获取。
为什么返回的临时路径下找不到对应文件
核心原因有两点:
- 临时文件有严格的生命周期限制:PHP上传产生的临时文件仅在当前请求处理过程中存在,一旦请求处理完成、响应返回给客户端,PHP会自动删除所有本次请求生成的临时文件。如果你是先打印出临时路径,等请求结束后再手动打开本地目录查找,文件已经被系统自动清理,自然无法找到。
Storage::move()调用方式错误:Laravel的Storage门面默认操作配置好的文件磁盘(默认local磁盘对应根目录为storage/app),move()方法要求第一个参数传入相对于磁盘根目录的相对路径。当你传入系统绝对路径C:\wamp64\tmp\phpD3D.tmp时,Storage会在storage/app目录下拼接该路径查找文件,根本不会访问系统临时目录,因此会抛出文件不存在的错误。
正确的文件存储实现
不要直接操作$_FILES超全局变量或手动处理临时路径,使用Laravel内置的上传文件处理能力即可,框架会自动完成临时文件读取、合法性校验、移动、清理的全流程,不需要关心临时文件的实际存储位置:
- 通过请求实例获取上传文件,先做参数校验:
// 控制器方法中注入Request实例 public function upload(\Illuminate\Http\Request $request) { // 校验上传字段,file对应Postman中传文件的表单字段名 $request->validate([ 'file' => 'required|file' ]); $uploadFile = $request->file('file');
- 调用文件实例的
storeAs方法直接存储到目标路径:
// 第一个参数是目标目录,第二个参数是保存的文件名,默认存储到local磁盘 $savePath = $uploadFile->storeAs('diba/wifis/3', 'abc.gz'); // 存储成功后$savePath为文件相对于磁盘根目录的路径,可直接通过Storage门面访问 }
特殊场景下如果需要手动操作临时文件,必须在当前请求的代码执行周期内完成操作,不要等请求结束后再去本地目录查找。如果一定要手动移动文件,可使用PHP原生的
move_uploaded_file()函数,但该方式需要自行处理目录权限、文件合法性校验,不推荐在Laravel项目中使用。
内容的提问来源于stack exchange,提问作者Agustín Tamayo Quiñones
相关产品推荐
相关产品推荐

