我正在寻找一种简单的方法来将图像从远程服务器导入到使用PHP的本地文件夹中。我没有通过FTP访问服务器,但可以通过HTTP访问所有远程图像(即http://www.mydomain.com/myimage.jpg)。通过HTTP从远程服务器复制图像
示例使用:用户希望将图像添加到他的个人资料。该图片已经存在于网络上,并且用户提供了一个直接的URL。我不希望将图像热链接,而是从我的域名导入和投放。
我正在寻找一种简单的方法来将图像从远程服务器导入到使用PHP的本地文件夹中。我没有通过FTP访问服务器,但可以通过HTTP访问所有远程图像(即http://www.mydomain.com/myimage.jpg)。通过HTTP从远程服务器复制图像
示例使用:用户希望将图像添加到他的个人资料。该图片已经存在于网络上,并且用户提供了一个直接的URL。我不希望将图像热链接,而是从我的域名导入和投放。
如果你有PHP5和你的服务器上启用的HTTP流包装,这是令人难以置信的简单将其复制到本地文件:
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');
这会照顾您需要的任何流水线等。如果您需要提供一些HTTP参数,则可以提供第三个“流上下文”参数。
使用GET请求下载图像并将其保存到服务器上的Web可访问目录中。
当您使用PHP时,您可以使用curl
从其他服务器下载文件。
这是非常简单的使用file_get_contents。只需提供网址作为第一个参数。
出于安全原因,这被锁定到许多共享主机上的本地文件系统。cURL更好,更快,更强大等...并且通常在阻止远程文件系统上打开的主机上可用。 – Oli 2009-05-26 07:46:27
如果cURL可用,那会更好。请参阅cUrl at php.net – PatrikAkerstrand 2009-05-26 08:12:49
你已经得到了有关这四种可能性:
Remote files。这需要在php.ini中启用allow_url_fopen
,但这是最简单的方法。
或者,如果您的PHP安装支持,您可以使用cURL。甚至有一个example。如果你真的想手动使用HTTP module。
甚至不要尝试use sockets directly。
为什么“甚至不尝试直接使用套接字”? (这是我使用的,https://gist.github.com/0893a7ec908ff508aac6) – Gajus 2012-11-16 00:45:36
@Gajus:你不直接在该代码段中使用套接字。您正在使用php的功能打开远程文件。 – 2012-11-16 09:10:49
这里是最基本的方法:
$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);
但是如果你做很多很多的这个(或您的主机阻止文件访问远程系统),可以考虑使用卷曲,这是更高效,速度更快,并可在更多共享主机上使用。
您还可以欺骗用户代理看起来像桌面而不是机器人!
$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传递它以确保它确实是图像。
要用GD检查图像,请考虑在保存文件后立即运行此文件:http://www.psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - 如果它返回false,请立即删除文件。 – Oli 2009-05-26 07:54:11
在`curl_close($ ch)`之前,你错过了`curl_exec($ ch)`,`fclose($ ch)`应该放在最后,而不是`curl_close($ ch)`之前,这意味着在关闭文件之前没有文件写入文件,因此您只会得到一个空文件。 – 2010-12-06 09:54:53
既然你已经标记了你的问题'php',我会假设你的服务器上运行着php。你最好的选择是,如果你控制自己的Web服务器,然后编译cURL到PHP。这将允许您的Web服务器向其他Web服务器发出请求。从安全角度来看,这可能非常危险,所以大多数基本的Web托管服务提供商都不会启用此选项。
这是php man page on using cURL。在评论中你可以找到一个下载和图像文件的例子。
如果你不想使用libcurl,你可以使用fsockopen编写代码。这是内置到PHP(但可能会禁用您的主机),并可以直接读取和写入套接字。见Examples on the fsockopen man page。
PHP有一个内置函数file_get_contents(),它将文件的内容读入字符串。
<?php
//Get the file
$content = file_get_contents(" http://example.com/image.jpg ");
//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>
如果您希望将文件存储在数据库中,只需使用$ content变量并且不要将文件保存到磁盘。
使用curl是一种很好的方法,因为一些服务器家伙不支持file_get_contents出于安全原因 – 2012-02-20 09:10:41
新建文件夹并将其命名为敌人例如下载 打开记事本并插入该代码
只能改变http://www.google.com/aa.zip到您的文件,并保存到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);
?>
从浏览器
终于进入到这些网址 http://www.example.com/download/m.php
你会在下载文件夹中看到来自其他服务器的文件下载
感谢
使用
$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
我试图复制/使用复制功能behint代理下载远程文件,但复制无需代理直接连接。
我试图将我的设置设置为默认上下文,并将其作为3.函数参数进行复制。
但是看起来上下文从未使用,但readfile
或get_headers
使用相同的上下文成功。
Here's我的代码:
$url = "http://myserver.com/testfile";
$context_opts = array(
"http" => array(
"proxy" => "tcp://myProxy:8080",
"request_fulluri" => True,
"ignore_errors" => true
)
);
stream_context_get_default($context_opts);
print_r(get_headers($url,1));
copy($url,$filename, stream_context_create($context_opts));
我的服务器与运行:
已启用urlfopen http和https流注册为php
This answer帮助我将图像从服务器下载到客户端。
<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);
不要在服务器有这个代理模块? – jiggunjer 2017-10-24 09:16:37