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

news2024/9/20 22:34:33

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

除毛大作战,选择你的清理工具——希喂、美的宠物空气净化器PK

随着气温的升高,又到了宠物的换毛季。猫咪在家里疯狂掉毛,而铲屎官也陷入清理难题。幸好,有宠物空气净化器可以帮助铲屎官减轻打扫负担。那么宠物空气净化器又该如何挑选呢?哪款宠物空气净化器效果更佳?我也很想知道答…

【JVM】剖析字符串与数组的底层实现(一)

剖析字符串与数组的底层实现 字符数组的存储方式 JVM有三种模型: 1.Oop模型:Java对象对应的C对象2.Klass模型:Java类在JVM对应的C对象3.handle模型 字符串常量池 即String Pool,但是JVM中对应的类是StringTable,底层实现是一个hashtable,如代码所示 …

老师怎样分班更便捷?

随着新学期的钟声敲响,老师们又迎来了一年中最繁忙的时刻。开学之初,除了要处理日常的教学事务,老师们还肩负着一项重要任务——给新生进行分班。 其实老师们完全可以不必那么劳累。在这个科技日新月异的时代,有许多工具可以帮助老…

计算机毕业设计选题推荐-高中素质评价档案系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

SOMEIP_ETS_061: Sending_two_SOMEIP_Messages_in_a_row

测试目的: 验证设备(DUT)能够处理在单个UDP数据包中发送的多个SOME/IP消息,并对所有这些SOME/IP消息给出正确的响应。 描述 本测试用例旨在检查DUT在接收到一个包含多个SOME/IP消息的UDP数据包时,是否能够对所有包含…

如何使用MQTT订阅摄像机/NVR/DVR的AI报警

H5S内置MQTT服务,并把设备报警默认推送到MQTT服务器上,进入 设置-》协议-》MQTT配置MQTT服务参数,配置后需要重启生效。 MQTT开启后,就可以使用第三方MQTT客户端订阅事件,以下以MQTTX( https://mqttx.app/ )为例。 链…

深入解析css-学习小结

绪论 盒模型 层叠 优先级 继承 层叠 层叠指规则冲突时,如何选择规则。规则冲突解决顺序: 样式表来源 用户代理样式 用户代理样式:浏览器默认样式 作者样式表:你自己写的css样式 作者样式表会覆盖用户代理样式,因…

宅家必备神器!远程控制软件,让你随时随地掌控一切

在数字化时代,远程控制软件已经成为我们日常生活和工作中不可或缺的工具。今天,我将分享五款我使用过的远程控制软件的使用感受,希望大家能够选择到一款适合自己的远控工具: 一、向日葵远程控制 直通车(粘贴到浏览器…

基于xr-frame实现微信小程序的图片扫描识别AR功能(含源码)

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案,基于混合方案实现,性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定,发布为正式版,但仍有一些功能还在开发&#…

NWM口罩佩戴检测算法,浅析口罩佩戴检测从源码到实际应用的全面指南

一、背景 随着新冠疫情的全球蔓延,佩戴口罩成为了预防病毒传播的重要措施。然而,随着疫情的持续,社会上仍存在不少未佩戴口罩的行为,这给公共健康带来了巨大的风险。在这样的背景下,基于计算机视觉的口罩检测算法应运…

ML307R_APP_DEMO_SDK TCP/UDP使用介绍

ML307R_APP_DEMO_SDK是在ML307R_OpenCPU_Standard_SDK标准代码基础上,新增了面向用户APP层的demo示例,与标准代码中examples的示例代码不同,app_demo实现了联网自动化,数据透传,各功能可独立自动运行,并对用…

【TB作品】TM1637芯片数码管,PIC16单片机驱动显示,Proteus仿真

文章目录 效果模块芯片介绍code 效果 只能是共阳数码管: 模块 芯片介绍 TM1637芯片是一种常用于LED数码管显示控制的驱动芯片,下面是各引脚的详细说明: DIO (Data Input/Output) - 管脚号: 17 功能: 串行数据输入/输出,DIO引脚…

JVM经典的垃圾收集器

经典垃圾收集器 目录 Serial收集器ParNew收集器Parallel Scavenge收集器 Serial Old收集器Parallel Old收集器CMS 收集器Garbage First收集器 以上是经典收集器的关系图 Serial收集器 Serial收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说…

『功能项目』禁止射线穿透行为【06】

我们打开上一篇04禁止射线穿透行为项目, 本章要做的事情是在Unity编辑器中添加 新输入系统 实现主角在场景中鼠标右键可以使主角 转向。 本次项目需要让Unity引擎重新启动所以先保存当前项目 再次打开项目后, 修改为Both 点击Apply前注意要先保存项目&a…

数据结构——树的三种表示方法

目录 引言 树 1.树的定义 2.树的基本概念 3.树的表示方式 (1)双亲表示法 (2)孩子表示法 (3)左孩子右兄弟表示法 (4)树的应用 结束语 引言 在学习完栈和队列的之后后,我们接下来学习新的数据结构——树。 树 1.树的定义 树是一种非线性数据结构&#x…

JavaScript 数据结构 ==== 二叉树

目录 二叉树 结构 二叉树和二叉搜索树介绍 1.创建树 2.插入一个键 3.树的遍历 中序排序 先序遍历 后序遍历 4.搜索树中的值 5.删除节点 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtre…

Docker Desktop镜像路径修改一直报错

一 点击Apply & Restart报错 [Window Title] Docker Desktop[Main Instruction] Error migrating WSL disk[Content] An error occurred while migrating the Docker Desktop WSL data disk to its new location:moving disk file: rename C:\Users\Lenovo\AppData\Local\D…

Linux 进程 | 进程地址空间

文章目录 进程地址空间程序地址空间进程地址空间 进程地址空间 程序地址空间 地址空间一共有如下的几个区域,从下到上地址逐渐增加,其中栈区的空间是从上往下使用,即从高地址往低地址增长;堆区的空间是从下往上使用,…

简单实现进度条效果(vue2)

如果用echarts或者其他图表来写个进度条有点大材小用&#xff0c;所以直接简单html、js写一下就可以&#xff1b; 以下代码基于vue2&#xff0c; 部分代码来自国内直连GPT/Claude镜像站 <template><div class"progress-container"><div class"p…

aosp源码导入android studio无法跳转-学员答疑

背景&#xff1a; 在学习framework入门课时候&#xff0c;一个很重要环节就是导入aosp的源码到android studio&#xff0c;这样有了IDE之后开发起来就很方便了&#xff0c;但是很多学员朋友对编译出来的ipr&#xff0c;iml文件改造不知道该怎么搞&#xff0c;导致android stud…