我正在寻找一种使用PHP将图像从远程服务器导入/复制到本地文件夹的简单方法。我没有FTP访问服务器,但可以通过HTTP访问所有远程图像(即http://www.mydomain.com/myimage.jpg)。
使用示例:用户希望将图像添加到他的个人资料中。该图像已存在于Web上,用户提供了直接URL。我不希望热链接图像,而是从我的域中导入和提供服务。
答案 0 :(得分:145)
如果您的服务器上启用了PHP5并启用了HTTP流包装器,则将其复制到本地文件非常简单:
copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');
这将处理所需的任何流水线等。如果您需要提供一些HTTP参数,则可以提供第三个“流上下文”参数。
答案 1 :(得分:28)
使用
$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);
答案 2 :(得分:10)
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变量,不要将文件保存到磁盘。
答案 3 :(得分:7)
你有四种可能性:
Remote files。这需要在php.ini中启用allow_url_fopen
,但这是最简单的方法。
如果你真的想手动使用HTTP module。
甚至不要尝试use sockets directly。
答案 4 :(得分:4)
这是最基本的方式:
$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,它更有效,更快速,并且可以在更多共享主机上使用。
您还可以欺骗用户代理看起来像桌面而不是机器人!
$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传递它以确保它确实是图像。
答案 5 :(得分:2)
使用file_get_contents非常简单。只需提供url作为第一个参数。
答案 6 :(得分:2)
制作文件夹并将其命名为foe示例下载 打开记事本并插入此代码
仅将http://www.google.com/aa.zip更改为您的文件,并将其保存到m.php,例如
将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 http://www.example.com/download/m.php
您将在下载文件夹中看到从其他服务器下载文件
感谢
答案 7 :(得分:1)
我尝试使用代理后面的复制功能复制/下载远程文件,但是复制直接连接而没有代理。
我尝试将我的设置设置为默认上下文,并将其设为3.要复制的函数参数。
但看起来上下文从未使用过,但readfile
或get_headers
使用相同的上下文成功。
这是我的代码:
$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
答案 8 :(得分:0)
使用GET请求下载图像并将其保存到服务器上的Web可访问目录中。
在使用PHP时,可以使用curl
从其他服务器下载文件。
答案 9 :(得分:0)
既然你已经标记了你的问题'php',我会假设你在你的服务器上运行php。你最好的选择是你控制自己的网络服务器,然后将cURL编译成php。这将允许您的Web服务器向其他Web服务器发出请求。从安全角度来看,这可能非常危险,因此大多数基本Web托管提供商都不会启用此选项。
这是php man page on using cURL。在评论中,您可以找到下载和图像文件的示例。
如果您不想使用libcurl,可以使用fsockopen编写代码。这是内置到php(但可能在您的主机上禁用),并可以直接读取和写入套接字。请参阅Examples on the fsockopen man page。
答案 10 :(得分:0)
对于那些需要保留原始文件名和扩展名的人
$origin = 'http://example.com/image.jpg';
$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);
$dest = 'myfolder/' . $filename . '.' . $ext;
copy($origin, $dest);
答案 11 :(得分:-3)
This answer帮助我将图像从服务器下载到客户端。
<a download="original_file.jpg" href="file/path.jpg">
<img src="file/path.jpg" class="img-responsive" width="600" />
</a>