麻烦帮我看下,总是有些产品缩略图有问题,

bug问题 · fecshoper · 于 6年前 发布 · 2504 次阅读

产品列表链接,http://www.normankeys.com/tango 其中的产品链接经常有几个就是生成缩略图有问题 http://www.normankeys.com/tango-rover-key-maker-software

共收到 20 条回复
1楼 已删除.
Fecmall#26年前 0 个赞

是不是文件权限导致的?你用 chmod 777 -R appimage/common 试试

protected function actionGetResize($imageVal, $imgResize, $isWatered = false)
    {
        
        $originImgPath = $this->getDir($imageVal);
        if (!file_exists($originImgPath)) {
            $originImgPath = $this->getDir($this->defaultImg);
        }
        $waterImgPath = '';
        if ($isWatered) {
            $waterImgPath = $this->getDir('/'.$this->waterImg);
        }
        list($newPath, $newUrl) = $this->getProductNewPath($imageVal, $imgResize, $waterImgPath);
        if (!file_exists($newPath)) {
            \fec\helpers\CImage::saveResizeMiddleWaterImg($originImgPath, $newPath, $imgResize, $waterImgPath);
        }

        return $newUrl;
    }

如果还不行,你自己按照报错,找到相应的文件,试试,我程序要改一下,遇到这种情况直接过滤掉,而不报错。

fecshoper#36年前 0 个赞

@Terry #2楼 appimage权限都是777

Fecmall#46年前 0 个赞

不仅仅这个文件,是这个文件夹下面的所有子文件夹,按照上面的命令执行下

Fecmall#56年前 0 个赞

我进行了小更新:

你更新下试试

services/product/Image.php


protected function actionGetResize($imageVal, $imgResize, $isWatered = false)
    {
        
        $originImgPath = $this->getDir($imageVal);
        if (!file_exists($originImgPath)) {
            $originImgPath = $this->getDir($this->defaultImg);
        }
        $waterImgPath = '';
        if ($isWatered) {
            $waterImgPath = $this->getDir('/'.$this->waterImg);
        }
        list($newPath, $newUrl) = $this->getProductNewPath($imageVal, $imgResize, $waterImgPath);
        if($newPath && $newUrl){
            if (!file_exists($newPath)) {
                \fec\helpers\CImage::saveResizeMiddleWaterImg($originImgPath, $newPath, $imgResize, $waterImgPath);
            }

            return $newUrl;
        }
    }
	
	
public static function createFloder($baseDir,$createdDir){
		if(!is_dir($baseDir)){
			throw new InvalidValueException('base dir is not a correct dir');
		}
		if(!$createdDir){
			throw new InvalidValueException('created dir can not empty');
		}
		if(!is_array($createdDir)){
			$createdDir = trim($createdDir,'/');
			$dir_arr = explode('/',$createdDir);
		}else{
			$dir_arr = $createdDir;
		}
		$dir = $baseDir;
		foreach($dir_arr as $folder){
			$dir = $dir.'/'.$folder;
			if(!is_dir($dir)){
				mkdir($dir,0777);
			}
		}
        if(is_dir($dir)){
            return $dir;
        }else{
            return false;
        }
		
	}

上面两个函数替换一下, 然后把 @fec/helpers/CDir.php

public static function createFloder($baseDir,$createdDir){
		if(!is_dir($baseDir)){
			throw new InvalidValueException('base dir is not a correct dir');
		}
		if(!$createdDir){
			throw new InvalidValueException('created dir can not empty');
		}
		if(!is_array($createdDir)){
			$createdDir = trim($createdDir,'/');
			$dir_arr = explode('/',$createdDir);
		}else{
			$dir_arr = $createdDir;
		}
		$dir = $baseDir;
		foreach($dir_arr as $folder){
			$dir = $dir.'/'.$folder;
			if(!is_dir($dir)){
				mkdir($dir,0777);
			}
		}
        if(is_dir($dir)){
            return $dir;
        }else{
            return false;
        }
		
	}

替换一下试试

Fecmall#66年前 0 个赞

应该是你前面创建文件路径失败造成的,你自己做下输出,就找出来问题所在了。

感觉你的动手能力太差!

出来这个问题,自己做下数据,把自己输出的信息贴上来,别这样冷不丁的扔上来。

Fecmall#76年前 0 个赞

哎,不说你了,别打击了你的自信心,那就罪过了,说这些是为了让你多动手,多思考。

8楼 已删除.
fecshoper#96年前 0 个赞

@Terry #5楼 :thumbsup:

Fecmall#106年前 0 个赞

@fecshoper #9楼 你的域名:http://www.normankeys.com/ ,是正式域名吗、?可以做个展示放出来让别人看看吗? 如果方便的话

fecshoper#116年前 0 个赞

@Terry #10楼 可以啊

Fecmall#126年前 0 个赞

@fecshoper #11楼 多谢

Fecmall#136年前 0 个赞

http://www.normankeys.com/transponder 你看这个报错:

imagejpeg(/www/yii2_fecshop/appimage/common/media/catalog/product/cache/bd935443df1c50537d4edaab4af5d446/230/230/0/1a/01ake1brrlg2bt11506330509.jpg): failed to open stream: No such file or directory

你的这个文件路径应该是不存在,创建失败:/www/yii2_fecshop/appimage/common/media/catalog/product/cache/bd935443df1c50537d4edaab4af5d446/230/230/0/1a

Fecmall#146年前 0 个赞

而创建文件是在这里

protected function getProductNewPath($imageVal, $imgResize, $waterImgPath)
    {
        if (!$this->_md5WaterImgPath) {
            if (!$waterImgPath) {
                $waterImgPath = 'defaultWaterPath';
            }
            //echo $waterImgPath;exit;
            $this->_md5WaterImgPath = md5($waterImgPath);
        }

        $baseDir = '/cache/'.$this->_md5WaterImgPath;
        if (is_array($imgResize)) {
            list($width, $height) = $imgResize;
        } else {
            $width = $imgResize;
            $height = '0';
        }

        $imageArr = explode('/', $imageVal);
        $dirArr = ['cache', $this->_md5WaterImgPath, $width, $height];
        foreach ($imageArr as $igf) {
            if ($igf && !strstr($igf, '.')) {
                $dirArr[] = $igf;
            }
        }
        $createDir = \fec\helpers\CDir::createFloder($this->getBaseDir(), $dirArr);
        if($createDir){
            $newPath = $this->getBaseDir().$baseDir .'/'.$width.'/'.$height.$imageVal;
            $newUrl = $this->getBaseUrl().$baseDir .'/'.$width.'/'.$height.$imageVal;
            return [$newPath, $newUrl];
        }else{
            return [];
        }
    }

$createDir = \fec\helpers\CDir::createFloder($this->getBaseDir(), $dirArr); 这个代码执行的

这些说的都是思路

你按照我上面说的,修改下代码,试试,不同,只能你自己来顺一下找下问题了,我本地的都是好用的。

Fecmall#156年前 0 个赞

你先自己尝试处理,尽自己最大努力。

fecshoper#166年前 0 个赞

@Terry #15楼 :pray: :ok_hand:

Fecmall#176年前 0 个赞

@fecshoper #16楼 如果处理了这个问题,解决了,一定要来反馈下哈,方便后来人。

fecshoper#186年前 0 个赞

@Terry [#17楼](#comment17) 问题已找到

array(5) {
  [0]=>
  string(5) "cache"
  [1]=>
  string(32) "bd935443df1c50537d4edaab4af5d446"
  [2]=>
  int(500)
  [3]=>
  string(1) "0"
  [4]=>
  string(2) "z4"
}
string(35) "/0/z4/0z4ff9jah03x32p1506442965.jpg"
string(103) "/www/yii2_fecshop/appimage/common/media/catalog/product/cache/bd935443df1c50537d4edaab4af5d446/500/0/z4"

拼的路径不同

Fecmall#196年前 0 个赞

@fecshoper #18楼 解决方案写一下

什么原因导致的?

以及如何解决这个问题?

fecshoper#206年前 0 个赞

@Terry #19楼 我改了下这个方法

    protected function getProductNewPath($imageVal, $imgResize, $waterImgPath)
    {
        if (!$this->_md5WaterImgPath) {
            if (!$waterImgPath) {
                $waterImgPath = 'defaultWaterPath';
            }
            //echo $waterImgPath;exit;
            $this->_md5WaterImgPath = md5($waterImgPath);
        }

        $baseDir = '/cache/'.$this->_md5WaterImgPath;
        if (is_array($imgResize)) {
            list($width, $height) = $imgResize;
        } else {
            $width = $imgResize;
            $height = '0';
        }
        $imageArr = explode('/', $imageVal);
        unset($imageArr[0]);
        $dirArr = ['cache', $this->_md5WaterImgPath, $width, $height];
        foreach ($imageArr as $igf) {
            if (!strstr($igf, '.')) {
                $dirArr[] = $igf;
            }
        }
        \fec\helpers\CDir::createFloder($this->getBaseDir(), $dirArr);
        $newPath = $this->getBaseDir().$baseDir .'/'.$width.'/'.$height.$imageVal;
        $newUrl = $this->getBaseUrl().$baseDir .'/'.$width.'/'.$height.$imageVal;
        return [$newPath, $newUrl];
    }
Fecmall#216年前 0 个赞

我找到问题了,你的代码不够新,现在的代码是这个样子的:

foreach ($imageArr as $igf) {
            if ($igf && !strstr($igf, '.')) {
                $dirArr[] = $igf;
            }
        }

看if条件。

Fecmall#226年前 0 个赞

你改成下面的吧

protected function getProductNewPath($imageVal, $imgResize, $waterImgPath)
    {
        if (!$this->_md5WaterImgPath) {
            if (!$waterImgPath) {
                $waterImgPath = 'defaultWaterPath';
            }
            //echo $waterImgPath;exit;
            $this->_md5WaterImgPath = md5($waterImgPath);
        }

        $baseDir = '/cache/'.$this->_md5WaterImgPath;
        if (is_array($imgResize)) {
            list($width, $height) = $imgResize;
        } else {
            $width = $imgResize;
            $height = '0';
        }

        $imageArr = explode('/', $imageVal);
        $dirArr = ['cache', $this->_md5WaterImgPath, $width, $height];
        foreach ($imageArr as $igf) {
            if ($igf && !strstr($igf, '.')) {
                $dirArr[] = $igf;
            }
        }
        $createDir = \fec\helpers\CDir::createFloder($this->getBaseDir(), $dirArr);
        if($createDir){
            $newPath = $this->getBaseDir().$baseDir .'/'.$width.'/'.$height.$imageVal;
            $newUrl = $this->getBaseUrl().$baseDir .'/'.$width.'/'.$height.$imageVal;
            return [$newPath, $newUrl];
        }else{
            return [];
        }
    }
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics