大侠请留步,且看我这个怪异的文件上传:The file "/tmp/phpQYktzX" does not exist ???
问题描述
事情是这样的,我通过表单上传图片,得到了标题里的那个错误,但其实文件已经上传成功了,而且奇怪的地方在于我如果使用 dd()
方法查看的话是没问题的,不会报错。然后我把打印函数去掉,正常做路由跳转就会报错,下面给出比较详细的代码截图。
处理表单上传图片的代码
上图中打印的结果
高潮到了:如果我把第一张图里的打印函数都去掉,正常做路由跳转,则报错如下图
一直报错 The file "/tmp/XXXXXX" does not exist
。
ImageUploadHandler.php
<?php
namespace App\Handlers;
class ImageUploadHandler
{
// 只允许以下后缀名的图片文件上传
protected $allowed_ext = ["png", "jpg", "gif", 'jpeg'];
public function save($file)
{
// 构建存储的文件夹规则
// 文件夹切割能让查找效率更高。
$folder_name = "uploads/images/" . date("Ym/d", time());
// 文件具体存储的物理路径,`public_path()` 获取的是 `public` 文件夹的物理路径。
$upload_path = public_path() . '/' . $folder_name;
// 获取文件的后缀名,因图片从剪贴板里黏贴时后缀名为空,所以此处确保后缀一直存在
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';
// 值如:14935210507BVc9v9ujP.png
$filename = time() . str_random(20) . '.' . $extension;
// 如果上传的不是图片将终止操作
if (!in_array($extension, $this->allowed_ext)) {
return false;
}
// 将图片移动到我们的目标存储路径中
$file->move($upload_path, $filename);
$imageSize = getimagesize($upload_path . '/' . $filename);
return [
'name' => $filename,
'path' => "/{$folder_name}/{$filename}",
'extension' => $extension,
'original_name' => $file->getClientOriginalName(),
'width' => $imageSize[0],
'height' => $imageSize[1],
];
}
}
补充描述
- 我在本地是完全没有问题的,本地开发环境是 Homestead。
- 服务器是 CentOS 7.4 版本。
- PHP Version:7.2.6
- Laravel Version:5.7.13
搞了好几个小时,没什么思路了,有大侠愿意帮忙分析一下吗?
如果缺少什么信息请留言,我会补充,谢谢!
看这个堆栈,似乎是因为
dd
之后抛出一个异常,在 Laravel 的异常处理器的App\Exceptions\Handler:report
方法内进入到了 Monolog 再次引发异常,导致的问题。一种猜测:进到控制器方法后 move 图片,dd
后的某条代码引发异常或错误,而后进到异常处理器,进到日志,日志检查到文件上传,所以希望再次读取上传的临时文件,然而已经被 move 了,所以抛出异常。可以继续追踪一下看看。重点关注一下Freshbitsweb\LaravelLogEnhancer\RequestDataProcessor
,卸载掉此扩展包尝试一下。