Paperclip图像上传在Rails中 - Paperclip :: CommandNotFoundError

24

我正在使用Paperclip在Rails中处理图像上传。在我的开发环境(OSX)中它运作良好,但现在在我的Web服务器上却出现了这个错误:

[paperclip] /Users/marky/bin/identify '-format' '%wx%h' '/tmp/stream,16451,2.JPG[0]' 2>/dev/null
[paperclip] An error was received while processing: #<Paperclip::CommandNotFoundError: Paperclip::CommandNotFoundError>
[paperclip] /Users/marky/bin/identify '-format' '%wx%h' '/tmp/stream,16451,2.JPG[0]' 2>/dev/null
[paperclip] An error was received while processing: #<Paperclip::CommandNotFoundError: Paperclip::CommandNotFoundError>

现在我明白了原因:identify实际上在/usr/bin/而不是我的开发机器上的/Users/marky/bin/。我有:

Paperclip.options[:command_path] = "/usr/bin"

我在development.rb中添加了代码,但仍然出现错误。我不知道如何修复它,有人能帮忙吗?


我也遇到了同样的问题。在我的情况下,似乎与Passenger有关,因为使用Mongrel时一切正常。你在使用Passenger吗? - TenJack
我之前也遇到了类似的错误,但是当我在development.rb中设置Paperclip.options[:command_path] = "/usr/bin"后,问题就解决了。顺便说一句,我正在使用Heroku。 - Özgür
5个回答

17

安装以下软件包以使用imagemagick

1) apt-get install imagemagick
2) apt-get install libmagickwand-dev
3) gem install rmagick

我认为你漏掉了第二个。


apt-get install imagemagick 正在读取软件包列表... 完成 正在建立依赖关系树
正在读取状态信息... 完成 imagemagick 已经是最新版。 以下软件包因为不再需要而自动被删除: apache2-mpm-worker libapr1 libaprutil1-ldap apache2-utils apache2.2-common libaprutil1-dbd-sqlite3 apache2.2-bin ssl-cert libaprutil1 请使用 'apt-get autoremove' 命令来卸载它们。 0 升级,0 新安装,0 个要卸载,0 未升级。
- Marky
apt-get install libmagickwand-dev 读取软件包列表... 完成 正在构建依赖树
读取状态信息... 完成 libmagickwand-dev 已经是最新版本。 以下软件包是自动安装的,现在不再需要它们: apache2-mpm-worker libapr1 libaprutil1-ldap apache2-utils apache2.2-common libaprutil1-dbd-sqlite3 apache2.2-bin ssl-cert libaprutil1 使用 'apt-get autoremove' 命令来删除它们。 0 个升级,0 个新安装,0 个要删除,0 个未升级。
- Marky
gem install rmagick 正在构建本地扩展。这可能需要一些时间... 成功安装了rmagick-2.13.1 已安装1个gem谢谢!刚刚运行了以上所有命令。这是否意味着rmagick实际上没有安装成功? - Marky

16
如果您使用Passenger来托管应用程序,请记住Passenger没有与登录用户相同的$PATH变量。检查Passenger是否可以看到ImageMagick命令的一种好方法是将此添加到其中一个erb模板中:
<%= `which convert` %>
<%= `echo $PATH` %>

同时可以将结果与在终端中运行相同命令的结果进行比较。另一个可能性是 ImageMagick 找不到它所需的库。在这种情况下,您可能需要导出另一个变量以让 ImageMagick 知道库的位置:

# my config/environments/development.rb
Paperclip.options[:command_path] = "DYLD_LIBRARY_PATH='/Users/jch/Library/ImageMagick-6.6.3/lib' /Users/jch/Library/ImageMagick-6.6.3/bin"

希望这可以帮到你 -jerry


1
同样地,您可以在shell中键入:heroku console %x{convert -version}+%x{which convert}。 - Özgür
2
请确保在将Paperclip.options[:command_path]添加(或更改)到environments/development.rb后重新启动服务器。 - gef

5
你可以在你的计算机上安装ImageMagick。 这些问题是由于它找不到某些方法而产生的。
要检查ImageMagick是否已经安装在你的计算机上,只需在终端上运行“convert”命令即可。

嗨,感谢您的回复。是的,我已经在我的机器上安装了ImageMagick。当我在终端中运行“convert”命令时,它可以正常运行。还有其他的想法吗?显然是路径的问题,但我不知道如何更改它。 - Marky
啊,但是如果我从命令行运行“identify”,无论我从哪个文件夹运行它,它都可以正常运行,这是否意味着还有其他问题? - Marky

2

在我的情况下,在生产服务器(NGINX + Passenger)的环境文件中设置Paperclip命令路径选项没有起作用。

相反,我将其设置为paperclip.rb初始化文件:

Paperclip.options[:command_path] = "/usr/bin/" if Rails.env.production?

我在更新Nginx后遇到了这个问题。谢谢你提供的解决方案! - penner

1

通过运行以下命令检查是否已安装imagemagick

 which convert

在你的控制台中。在我的情况下,结果如下:
$ which convert
/usr/bin/convert

然后我在config/environments/development.rb中添加了以下行,告诉Paperclip去哪里找Imagemagick。
Paperclip.options[:command_path] = "/usr/local/bin/"

1
如果 which convert 显示 /usr/bin/convert,则在 paperclip.options[:command_path] = "/usr/local/bin/" 或 paperclip.options[:command_path] = "/usr/bin/convert/" 中。 - Sam

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