Php 通过HTTP从远程服务器复制映像
我正在寻找一种使用PHP将图像从远程服务器导入/复制到本地文件夹的简单方法。我无法通过FTP访问服务器,但所有远程映像都可以通过HTTP(即)访问Php 通过HTTP从远程服务器复制映像,php,image,import,curl,copy,Php,Image,Import,Curl,Copy,我正在寻找一种使用PHP将图像从远程服务器导入/复制到本地文件夹的简单方法。我无法通过FTP访问服务器,但所有远程映像都可以通过HTTP(即)访问 示例用法:用户希望将图像添加到其个人资料中。该图像已存在于web上,并且用户提供了一个直接URL。我不希望热链接图像,但希望从我的域中导入和提供服务。使用GET请求下载图像并将其保存到服务器上的web可访问目录中 使用PHP时,可以使用curl从另一台服务器下载文件。使用它非常简单。只需提供url作为第一个参数。您已经了解了以下四种可能性: 。这需
示例用法:用户希望将图像添加到其个人资料中。该图像已存在于web上,并且用户提供了一个直接URL。我不希望热链接图像,但希望从我的域中导入和提供服务。使用GET请求下载图像并将其保存到服务器上的web可访问目录中
使用PHP时,可以使用
curl
从另一台服务器下载文件。使用它非常简单。只需提供url作为第一个参数。您已经了解了以下四种可能性:
- 。这需要
,但这是最简单的方法允许在php.ini中启用\u url\u fopen
- 或者,如果PHP安装支持,也可以使用。甚至还有一个
- 如果您真的想手动执行,请使用
- 甚至都不要尝试
- 以下是最基本的方法:
$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");
while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);
fclose($rfile);
fclose($lfile);
但是如果你做了很多很多(或者你的主机阻止文件访问远程系统),考虑使用CURL,它更有效,速度更快,在更多共享主机上可用。p> 您还可以欺骗用户代理,使其看起来像桌面而不是机器人
$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);
fclose($lfile);
curl_close($ch);
对于这两个实例,您可能希望通过GD传递它,以确保它确实是一个图像。既然您已将问题标记为“php”,我将假设您在服务器上运行php。最好的选择是控制自己的web服务器,然后将cURL编译成php。这将允许您的web服务器向其他web服务器发出请求。从安全角度来看,这可能非常危险,因此大多数基本的web托管提供商不会启用此选项 这是我的建议。在评论中,您可以找到一个示例,该示例下载了图像文件
如果不想使用libcurl,可以使用fsockopen编写代码。这是内置在php中的(但可能在主机上被禁用),可以直接读取和写入套接字。请参阅。PHP有一个内置函数file_get_contents(),它将文件内容读入字符串。
如果希望将文件存储在数据库中,只需使用$content变量,而不将文件保存到磁盘。如果服务器上启用了PHP5和HTTP流包装器,则将其复制到本地文件非常简单:
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');
这将处理所需的任何管道等。如果您需要提供一些HTTP参数,则可以提供第三个“流上下文”参数。创建文件夹并将其命名为示例下载 打开记事本并插入此代码 例如,仅更改文件并将其保存到m.php chamod将php文件下载到666,并将文件夹下载到777
<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>
最后,从浏览器输入这些URL
您将在下载文件夹中看到从其他服务器下载的文件
谢谢使用
$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
帮助我将图像从服务器下载到客户端
<a download="original_file.jpg" href="file/path.jpg">
<img src="file/path.jpg" class="img-responsive" width="600" />
</a>
适用于需要保留原始文件名和扩展名的用户
$origin = 'http://example.com/image.jpg';
$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);
$dest = 'myfolder/' . $filename . '.' . $ext;
copy($origin, $dest);
出于安全原因,这被锁定到许多共享主机上的本地文件系统。卷曲更好、更快、更强等等。。。并且通常在那些阻止远程文件系统上的fopen的主机上可用。如果cURL可用,那就更好了。在PHP.NET中查看用GD检查的图像,在保存文件后考虑运行这个问题:如果它返回false,立即删除文件。在代码< > CURLYORACK($CH)之前,您错过了<代码> CURLYEXEC($CH),而<代码> FRACK($CH)应该放在最后,而不是在<代码> CurLyCox($CH)之前,这意味着在没有任何内容写入文件之前关闭文件,因此只会得到一个空文件。请记住,在php.ini中,allow_url_fopen必须为=on。allow_url_fopen注释刚刚解决了一个多小时的挠头问题。谢谢,@mauro.dec!像这样的URL做了什么
http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop
???谢谢你的回答-我想我就快到了!当你说“/tmp/file.jpg”时,它与什么有关?web服务器的根目录。。。(例如:/var/www/vhosts等)或网站的根目录:/httpdocs/??无法看到出现的文件,我已将url fopen设置为“开”!!不要使用https,只使用httpusing curl是一个好方法,因为一些服务器人员出于安全原因不支持文件内容小文件的提示,但对于大文件,php内存将爆炸:(curl也不是一个好选择,因为它不是标准php的一部分,为什么“甚至不要尝试直接使用套接字?”?(这就是我正在使用的,)@Gajus:你没有在这个代码段中直接使用套接字。你在使用php的功能来打开远程文件。谢谢!第二个解决方案正在工作。最重要的是,解决方案对我不起作用:小文件的提示,但对于大文件,php内存将爆炸:(难道服务器没有代理模块吗?
$origin = 'http://example.com/image.jpg';
$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);
$dest = 'myfolder/' . $filename . '.' . $ext;
copy($origin, $dest);