likeshop采集商品图片无法保存解决方案

封面图
在这里插入图片描述

一个修复单,客户的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;
}

代码详细功能说明

  1. 读取图片文件内容

    $data = file_get_contents($absolute_path);
    

    通过 file_get_contents 函数读取指定路径($absolute_path)的文件内容,存储在变量 $data 中。

  2. 构造保存路径

    $fileName = $save_url . $file_name;
    $fileLocalFullName = public_path() . $fileName;
    

    构造文件在服务器上的保存路径。$fileName 包含了保存目录和文件名,$fileLocalFullName 是文件的完整路径。

  3. 获取目录并创建目录

    $directory = dirname($fileLocalFullName);
    if (!is_dir($directory)) {
        mkdir($directory, 0755, true);
    }
    

    通过 dirname 函数获取文件路径中的目录部分。如果目录不存在,则使用 mkdir 函数创建它。0755 是文件权限设置,true 表示递归创建目录。

  4. 写入文件

    $f = fopen($fileLocalFullName, "w");
    fwrite($f, $data);
    fclose($f);
    

    使用 fopen 函数以写入模式打开文件。将读取的图片数据写入文件,然后使用 fclose 函数关闭文件。

  5. 设置上传文件信息

    app('\app\Request')->setTempUploadLocalWithFiles([
        'file'  => [
            'name'      => $fileName,
            'type'      => '',
            'size'      => filesize($fileLocalFullName),
            'tmp_name'  => $fileLocalFullName,
            'error'     => 0,
            'full_path' => $fileLocalFullName,
        ],
    ]);
    

    将文件的相关信息(如文件名、大小、路径等)设置到请求的临时上传文件中,以便后续处理。

  6. 调用上传服务

    $file = UploadService::image(0);
    

    调用 UploadService::image 方法将文件信息写入数据库。这里 0 可能表示一个默认或特定的参数。

  7. 异常处理

    } catch (\Throwable $e) {
        $file = [];
    }
    

    捕获所有类型的异常并返回一个空数组,确保函数在发生错误时不会崩溃。

  8. 返回文件信息

    return $file;
    

    返回文件信息或者空数组,取决于是否发生了异常。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈钇谷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值