封面图
一个修复单,客户的likeshop采集tb商品后,保存到商品库的时候 主图无法显示
报错:
"/www/wwwroot/test.0ev.cn/server/public/uploads/l7pu2aqt/admin/images/d61d40dab9e6245f90b62ede72b51639.jpg"
string(6226) "think\exception\ErrorException:
fopen(/www/wwwroot/test.0ev.cn/server/public/uploads/l7pu2aqt/admin/images/d61d40dab9e6245f90b62ede72b51639.jpg): Failed
最终定位到问题是 app/common.php的saveImageToLocal方法
原本方法如下:
function saveImageToLocal($file_name, $absolute_path, string $save_url = 'uploads/images/')
{
try {
$data = file_get_contents($absolute_path);
$fileName = $save_url . $file_name;
$fileLocalFullName = public_path() . $fileName;
$f = fopen($save_url . $file_name, "w");
fwrite($f, $data);
fclose($f);
app('\app\Request')->setTempUploadLocalWithFiles([
'file' => [
'name' => $fileName,
'type' => '',
'size' => filesize($fileLocalFullName),
'tmp_name' => $fileLocalFullName,
'error' => 0,
'full_path' => $fileLocalFullName,
],
]);
//写入数据库中
$file = UploadService::image(0);
} catch (\Throwable $e) {
// var_dump($e->__toString());
$file = [];
}
return $file;
}
修复后方法如下:
function saveImageToLocal($file_name,$absolute_path,$save_url = 'uploads/images/')
{
try {
try {
$data = file_get_contents($absolute_path);
// var_dump($data);exit();
$fileName = $save_url . $file_name;
$fileLocalFullName = public_path() . $fileName;
$directory = dirname(public_path() . $fileName);
if (!is_dir($directory)) {
mkdir($directory, 0755, true); // 递归创建目录
}
$f = fopen(public_path() . $fileName, "w");
fwrite($f, $data);
fclose($f);
app('\app\Request')->setTempUploadLocalWithFiles([
'file' => [
'name' => $fileName,
'type' => '',
'size' => filesize($fileLocalFullName),
'tmp_name' => $fileLocalFullName,
'error' => 0,
'full_path' => $fileLocalFullName,
],
]);
//写入数据库中
$file = UploadService::image(0);
} catch (\Throwable $e) {
$file = [];
}
} catch (\Exception $e) {
$file = [];
}
区别在于
if (!is_dir($directory)) {
mkdir($directory, 0755, true); // 递归创建目录
}
如果目录不存在 则自动创建目录
代码详解
chatgpt协助整理
代码详细解释
function saveImageToLocal($file_name, $absolute_path, $save_url = 'uploads/images/')
{
try {
// 从绝对路径读取图片文件的内容
$data = file_get_contents($absolute_path);
// 构造文件在服务器上的保存路径
$fileName = $save_url . $file_name;
$fileLocalFullName = public_path() . $fileName;
// 获取保存路径的目录部分
$directory = dirname($fileLocalFullName);
// 如果目录不存在,则递归创建目录
if (!is_dir($directory)) {
mkdir($directory, 0755, true); // 0755是权限设置,true表示递归创建目录
}
// 打开文件以写入模式
$f = fopen($fileLocalFullName, "w");
// 将读取的图片数据写入文件
fwrite($f, $data);
// 关闭文件
fclose($f);
// 将文件信息添加到请求的临时上传文件中
app('\app\Request')->setTempUploadLocalWithFiles([
'file' => [
'name' => $fileName, // 文件名
'type' => '', // 文件类型
'size' => filesize($fileLocalFullName), // 文件大小
'tmp_name' => $fileLocalFullName, // 文件的完整路径
'error' => 0, // 错误码,0表示没有错误
'full_path' => $fileLocalFullName, // 文件的完整路径
],
]);
// 调用上传服务,将文件信息写入数据库
$file = UploadService::image(0);
} catch (\Throwable $e) {
// 捕获异常并返回一个空数组
$file = [];
}
return $file;
}
代码详细功能说明
-
读取图片文件内容
$data = file_get_contents($absolute_path);
通过
file_get_contents
函数读取指定路径($absolute_path
)的文件内容,存储在变量$data
中。 -
构造保存路径
$fileName = $save_url . $file_name; $fileLocalFullName = public_path() . $fileName;
构造文件在服务器上的保存路径。
$fileName
包含了保存目录和文件名,$fileLocalFullName
是文件的完整路径。 -
获取目录并创建目录
$directory = dirname($fileLocalFullName); if (!is_dir($directory)) { mkdir($directory, 0755, true); }
通过
dirname
函数获取文件路径中的目录部分。如果目录不存在,则使用mkdir
函数创建它。0755
是文件权限设置,true
表示递归创建目录。 -
写入文件
$f = fopen($fileLocalFullName, "w"); fwrite($f, $data); fclose($f);
使用
fopen
函数以写入模式打开文件。将读取的图片数据写入文件,然后使用fclose
函数关闭文件。 -
设置上传文件信息
app('\app\Request')->setTempUploadLocalWithFiles([ 'file' => [ 'name' => $fileName, 'type' => '', 'size' => filesize($fileLocalFullName), 'tmp_name' => $fileLocalFullName, 'error' => 0, 'full_path' => $fileLocalFullName, ], ]);
将文件的相关信息(如文件名、大小、路径等)设置到请求的临时上传文件中,以便后续处理。
-
调用上传服务
$file = UploadService::image(0);
调用
UploadService::image
方法将文件信息写入数据库。这里0
可能表示一个默认或特定的参数。 -
异常处理
} catch (\Throwable $e) { $file = []; }
捕获所有类型的异常并返回一个空数组,确保函数在发生错误时不会崩溃。
-
返回文件信息
return $file;
返回文件信息或者空数组,取决于是否发生了异常。