首页 > 解决方案 > 在 PHP 开发服务器 win 10 上更改 imagick 的权限或更改 tmp 目录

问题描述

我正在运行 symfony 开发服务器的 windows 10 pc 上开发 php7.1 应用程序,但每次我运行脚本将 svg 转换为 png 时都会收到此错误。

WriteBlob 失败`/tmp/5f49ac095abe6.png'@error/png.c/MagickPNGErrorHandler/1630

我刚买了这台电脑,脚本可以在我的旧 Windows 笔记本电脑上运行。我做了研究并怀疑这是一个权限问题,但我用尽了所有方法来更改 php 和 imagick tmp 存储位置。

如果确实是权限问题,那么我如何更新 php/imagick 保存 tmp 文件的位置。

这是我的整个参考方法:

private function createImageFromSVG(ConfigLogo $logoConfig)
{
    $svg = $logoConfig->getDefaultImage()->getContent();
    $idColorArray = [
        'first' => $logoConfig->getFirstColor(),
        'second' => $logoConfig->getSecondColor(),
        'third' => $logoConfig->getThirdColor(),
    ];

    foreach ($idColorArray as $state => $color) {
        if ($color != 'FFFFFF') {
            $svg = preg_replace(
                '/class="' . $state . '" style="fill:#([0-9a-fA-F]{6})/',
                'class="' . $state . '" style="fill:#' . $color,
                $svg
            );
        }
    }

    $fileName = sprintf('%s.png', uniqid());
    $filePath = sprintf('/tmp/%s', $fileName);
    $this->filePath = $filePath;

    $im = new \Imagick();
    $im->setBackgroundColor(new \ImagickPixel('transparent'));
    $im->readImageBlob($svg);
    $im->setImageFormat("png24");
    $im->writeImage($filePath);  //error !

    $file = new UploadedFile($filePath, $fileName .'.png');
    $im->clear();
    $im->destroy();

    $oldImages  = $logoConfig->getRenderedLogoImages();
    foreach ($oldImages as $image) {
        if ($image->getImageName() !== 'default_logo.png') {
            $this->uploadHandler->remove($image, 'imageFile');
        }
        $logoConfig->removeRenderedLogoImage($image);
    }

    $renderedImage = new ConfigLogoDefaultImage();
    $renderedImage->setImageFile($file);
    $renderedImage->setImageName($fileName);
    $logoConfig->addRenderedLogoImage($renderedImage);
    $this->operateImage($logoConfig, 'RenderedLogo');
}

错误发生在 line $im->writeImage($filePath);

提前感谢您对此的任何帮助。

标签: phpsymfonyimagick

解决方案


谁可能会遇到这个问题,在我在 C:/tmp 创建 tmp 目录后它就解决了。显然 imagick 不使用系统属性或 php.ini 中设置的系统 tmp 目录。


推荐阅读