在织梦(Dede)CMS系统中,有时会遇到无法下载远程图片并实现本地化的问题,这通常是由于服务器配置或代码限制导致的,以下是一些常见的解决方案:
开启远程图片本地化功能
1、编辑区域选项:
在文章编辑区域的上方,有一个“附加选项”,勾选“下载远程图片和资源”即可启用此功能。
也可以在系统设置中的“其他选项”里,找到并勾选“远程图片本地化”选项。
2、检查目录结构:
确保上传图片的目录中存在allimg
文件夹,如果更改了图片上传目录,这个文件夹可能会缺失,导致问题发生。
修改服务器配置
3、禁用fsockopen()函数:
如果服务器上禁用了fsockopen()
函数,可以通过修改PHP配置文件php.ini
来解决,找到disable_functions
项,去掉其中的fsockopen
。
另一种方法是替换代码中的fsockopen()
函数为stream_socket_client()
,具体操作如下:
打开/include/dedehttpdown.class.php
文件,找到第507行:
```php
$this>m_fp = @fsockopen($this>m_host, $this>m_port, $errno, $errstr, 10);
```
将其替换为:
```php
$this>m_fp = @stream_socket_client($this>m_host . ':' . $this>m_port, $errno, $errstr, 10);
```
保存文件并测试。
4、使用cURL支持HTTPS:
对于支持HTTPS的远程图片,可以在dedehttpdown.class.php
文件中添加cURL支持:
```php
if ($this>m_scheme == "https") {
$this>m_port = "443";
}
if (function_exists('curl_init') && function_exists('curl_exec')) {
$this>m_ch = curl_init();
curl_setopt($this>m_ch, CURLOPT_URL, $this>m_scheme . '://' . $this>m_host . ':' . $this>m_port . $this>m_path);
curl_setopt($this>m_ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($this>m_ch, CURLOPT_FOLLOWLOCATION, 1);
if ($requestType == "POST") {
curl_setopt($this>m_ch, CURLOPT_POST, 1);
// $content = is_array($post) ? http_build_query($post) : $post;
// curl_setopt($this>m_ch, CURLOPT_POSTFIELDS, urldecode($content));
}
if (!empty($this>m_cookies)) {
curl_setopt($this>m_ch, CURLOPT_COOKIE, $this>m_cookies);
}
if ($this>m_scheme == "https") {
curl_setopt($this>m_ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($this>m_ch, CURLOPT_SSL_VERIFYHOST, false);
}
$this>m_puthead = array();
$this>m_puthead["Host"] = $this>m_host;
if (count($this>m_puthead) > 0) {
foreach ($this>m_puthead as $k => $v) {
$headers[] = "$k: $v";
}
curl_setopt($this>m_ch, CURLOPT_HTTPHEADER, $headers);
}
curl_setopt($this>m_ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($this>m_ch, CURLOPT_TIMEOUT, 900);
$this>m_html = curl_exec($this>m_ch);
$status = curl_getinfo($this>m_ch);
if (count($status) > 0) {
foreach ($status as $key => $value) {
$key = str_replace("_", "", $key);
if ($key == "httpcode") {
$this>m_httphead["httpstate"] = $value;
}
$this>m_httphead[$key] = $value;
}
}
$this>m_error = curl_errno($this>m_ch);
return TRUE;
}
```
这段代码通过cURL库来处理HTTPS请求,确保能够正确下载并保存远程图片。
常见问题解答(FAQs)
Q1: 为什么开启远程图片本地化后仍然无法下载图片?
A1: 可能的原因是服务器禁用了fsockopen()
函数,请按照上述方法修改dedehttpdown.class.php
文件,将fsockopen()
替换为stream_socket_client()
,或者在php.ini
中解除对fsockopen()
的禁用。
Q2: 如果服务器不支持cURL,还有其他办法解决HTTPS图片无法下载的问题吗?
A2: 如果服务器不支持cURL,可以尝试使用pfsockopen()
函数替代fsockopen()
,具体步骤如下:
打开pub_httpdown.php
文件,找到以下代码:
```php
$this>m_fp = @ fsockopen($this>m_host, $this>m_port, $errno, $errstr, 10);
```
将其替换为:
```php
$this>m_fp = @ pfsockopen($this>m_host, $this>m_port, $errno, $errstr, 10);
```
保存文件并测试,看是否解决问题。
通过以上方法,可以有效解决Dedecms无法下载远程图片并实现本地化的问题,希望这些信息对你有所帮助!
Dede(织梦)不能下载远程图片实现图片本地化的解决方案
问题
在Dede(织梦)内容管理系统(CMS)中,有时会遇到无法下载远程图片的问题,这可能导致网页显示不完整或图片无法正常显示,以下将详细介绍几种实现图片本地化的解决方案。
解决方案
1. 修改PHP配置
原因:Dede可能因为PHP配置中的allow_url_fopen
参数被禁用,导致无法访问远程图片。
操作:
打开PHP配置文件php.ini
。
查找并取消注释allow_url_fopen = Off
(如果已禁用)。
修改为allow_url_fopen = On
。
重启Apache服务器以应用更改。
2. 使用curl扩展
原因:如果allow_url_fopen
被禁用,可以使用curl扩展来下载远程图片。
操作:
确保PHP安装了curl扩展。
在Dede的模板或插件中使用curl函数下载图片,
```php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/image.jpg");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$image = curl_exec($ch);
curl_close($ch);
file_put_contents("path/to/local/image.jpg", $image);
```
3. 使用第三方服务
原因:如果Dede无法直接下载图片,可以考虑使用第三方服务如CDN或图片存储服务。
操作:
注册并配置第三方服务。
将远程图片上传到第三方服务,并获取图片的新URL。
在Dede中替换远程图片链接为第三方服务提供的链接。
4. 修改Dede模板
原因:Dede模板中可能使用了不兼容的图片标签或方法。
操作:
检查Dede模板中的图片标签,确保它们是正确的。
如果使用<img>
标签,确保其src
属性指向正确的图片URL。
5. 使用插件或模块
原因:Dede可能没有内置的图片下载功能,可以使用第三方插件或模块来实现。
操作:
在Dede的插件市场寻找图片下载插件。
安装并配置插件,按照说明操作。
通过上述方法,可以有效地解决Dede无法下载远程图片的问题,实现图片的本地化,从而确保网页内容的完整性和美观性,在选择解决方案时,应根据具体情况和需求进行选择。