PHP ImagickException:未授权

38

有什么想法可以修复这个问题吗?

 ImagickException: not authorized `/tmp/magick-1552lvf2nIjaqx1W' @ error/constitute.c/ReadImage/412 

我以为这是权限问题,所以只是为了测试,我将我的/tmp目录设置为777。没有改变。这让我疯狂了。

命令:

<?php


$image = new \Imagick();
$image->readImageBlob('<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . $graph);

告诉我们是哪个命令导致了这个问题? - Mark Setchell
将您的命令粘贴到终端中可能会有所帮助——您是否已经成功使用Imagick?根据您的服务器设置,CHMOD可能需要设置为755。 - Bonzo
你尝试过设置并导出环境变量MAGICK_TMPDIR到其他的位置,以便你的脚本/CGI/程序可以写入吗? - Mark Setchell
可能是您的policy.xml文件中在<policymap>标签中包含了该文件类型作为匹配模式[意外地?]。 - kb.
我将我的策略映射注释掉了 >< - LukePOLO
显示剩余2条评论
4个回答

70

我按照以下步骤修复了致命错误:

Uncaught ImagickException: not authorized `../../c02_001.pdf'
@ error/constitute.c/ReadImage/412 

  1. sudo vi policy.xml from etc/Imagemagick-6/
  2. 注释掉以下行:

    <!-- <policy domain="coder" rights="none" pattern="MVG" /> -->
    
  3. 改写以下这一行内容

  4. <policy domain="coder" rights="none" pattern="PDF" />
    

    <policy domain="coder" rights="read|write" pattern="PDF" />
    
  5. sudo apt-get install inkscape

  6. 使用以下命令重新启动apache:sudo restart apache2

7
<政策 领域="编码器" 权限="读取|写入" 模式="PDF" />这对我起作用了。 - Chinmoy
11
如果您正在使用php-fpm,则使用“sudo service php7.2-fpm restart”(或您的PHP版本)而不是重新启动apache。 - Sam Sehnert
谢谢。我用 Vim 进行了这个更改,当然不是 Nano!#真正的程序员 - Brainmaniac
为什么第四步需要执行 sudo apt-get install inkscape 命令?不执行也能正常工作啊。谢谢,你也救了我的一天! - cronfy
  1. sudo service apache2 restart
  2. sudo服务apache2重启
- Jimit Shah

27

你的" MVG "政策可能是原因。请评论。

<policy domain="coder" rights="none" pattern="MVG" />

请修改/etc/ImageMagick/policy.xml文件,并重新启动Apache服务器。


谢谢您的回答!我使用brew安装东西。我的/etc/ImageMagick/policy.xml在usr/local/中 - 只是如果其他人以我的设置结束了。 - Brainmaniac
6
如果文件位置不同,您可以运行“locate policy.xm”查找文件。然后执行替换操作:“sudo sed -i -e 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/' /etc/ImageMagick-6/policy.xml”,也可参考以下链接:https://dev59.com/TVoU5IYBdhLWcg3wTVse#52677573。 - hakre
那么NGINX呢? - KSPR
@kspr - 对于nginx,您需要重新启动php-fpm - 对于apache,php运行时作为模块加载,对于nginx(和其他Web服务器),它是php的单独的fastcgi版本。 - DorianFM

1
我希望这个解决方案能够帮到你。我也遇到了同样的问题,而且我在实时服务器上。我试图按照上面Mikel Annjuk和hakre的回答进行操作,但是我无法更改/etc/ImageMagick/policy.xml文件,所以我联系服务器提供商来编辑文件并发送此URL以便进行步骤,但是他们没有回复我。
当我尝试解决这个问题时,我有一个想法,也许是我保存文件的文件路径的问题,所以我将基础路径更改为FCPATH,并解决了这个问题。我使用Codeigniter base_url()转换为php FCPATH来解决这个问题。
但是SVG转换器显示“no decode delegate”问题。
请在文件或代码开头添加以下行,如下所示。
$usmap = file_get_contents(base_url('convert/plus.svg')); 
     $find_string   = '<svg';
$position = strpos($usmap, $find_string);

   $svg_file_new ='<?xml version="1.0" encoding="UTF-8" standalone="no"?>'.substr($usmap, $position).'</svg>';
       file_put_contents(FCPATH.'convert/plus.svg', $svg_file_new);

        $usmap = base_url('convert/plus.svg'); 
$im = new Imagick($usmap);  
$im->setImageFormat("jpg"); 

$im->writeImage(FCPATH .'convert/plus.jpg');
$im->clear();
$im->destroy();

以上代码首先从文件中获取SVG代码,添加XML版本代码,然后将其放入文件中,最后将SVG转换为任何类型的图像,如jpg。

抱歉我的英语不好。


我不确定XML/SVG文件是否应该被读取为二进制大对象。尝试像正常图像一样进行读取。 - fmw42
只是简单的代码: $pdfPath = base_url('convert/ResumeAnusShahbaz0.jpeg'); $im = new imagick($pdfPath); $im->setImageFormat('pdf'); $im->writeImage(FCPATH .'convert/ResumeAnusShahbaz0.pdf'); $im->clear(); $im->destroy(); - Ghulam Abbas
它适用于许多图像格式,但我仍然发现一个问题是SVG转换到其他格式时超过12的情况。我已经检查过它可以工作,另一种格式我正在尝试转换,看看这段代码可以处理多少格式。 - Ghulam Abbas
我有SVG转换器更新的解决方案,请更新我的答案。 - Ghulam Abbas

0

PHP进程的"strace"显示如下内容:

sh: inkscape: 命令未找到

我通过以下方式解决了这个问题:

apt-get install inkscape

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接