2009-05-26 109 views
77

我正在尋找一種簡單的方法來將圖像從遠程服務器導入到使用PHP的本地文件夾中。我沒有通過FTP訪問服務器,但可以通過HTTP訪問所有遠程圖像(即http://www.mydomain.com/myimage.jpg)。通過HTTP從遠程服務器複製圖像

示例使用:用戶希望將圖像添加到他的個人資料。該圖片已經存在於網絡上,並且用戶提供了一個直接的URL。我不希望將圖像熱鏈接,而是從我的域名導入和投放。

+0

不要在服務器有這個代理模塊? – jiggunjer 2017-10-24 09:16:37

回答

142

如果你有PHP5和你的服務器上啓用的HTTP流包裝,這是令人難以置信的簡單將其複製到本地文件:

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg'); 

這會照顧您需要的任何流水線等。如果您需要提供一些HTTP參數,則可以提供第三個「流上下文」參數。

0

使用GET請求下載圖像並將其保存到服務器上的Web可訪問目錄中。

當您使用PHP時,您可以使用curl從其他服務器下載文件。

2

這是非常簡單的使用file_get_contents。只需提供網址作爲第一個參數。

+1

出於安全原因,這被鎖定到許多共享主機上的本地文件系統。cURL更好,更快,更強大等...並且通常在阻止遠程文件系統上打開的主機上可用。 – Oli 2009-05-26 07:46:27

+0

如果cURL可用,那會更好。請參閱cUrl at php.net PatrikAkerstrand 2009-05-26 08:12:49

7

你已經得到了有關這四種可能性:

+0

爲什麼「甚至不嘗試直接使用套接字」? (這是我使用的,https://gist.github.com/0893a7ec908ff508aac6) – Gajus 2012-11-16 00:45:36

+0

@Gajus:你不直接在該代碼段中使用套接字。您正在使用php的功能打開遠程文件。 – 2012-11-16 09:10:49

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); 

但是如果你做很多很多的這個(或您的主機阻止文件訪問遠程系統),可以考慮使用捲曲,這是更高效,速度更快,並可在更多共享主機上使用。

您還可以欺騙用戶代理看起來像桌面而不是機器人!

$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傳遞它以確保它確實是圖像。

+1

要用GD檢查圖像,請考慮在保存文件後立即運行此文件:http://www.psoug.org/snippet/Check_if_an_image_exists_GD_364.htm - 如果它返回false,請立即刪除文件。 – Oli 2009-05-26 07:54:11

+2

在`curl_close($ ch)`之前,你錯過了`curl_exec($ ch)`,`fclose($ ch)`應該放在最後,而不是`curl_close($ ch)`之前,這意味着在關閉文件之前沒有文件寫入文件,因此您只會得到一個空文件。 – 2010-12-06 09:54:53

0

既然你已經標記了你的問題'php',我會假設你的服務器上運行着php。你最好的選擇是,如果你控制自己的Web服務器,然後編譯cURL到PHP。這將允許您的Web服務器向其他Web服務器發出請求。從安全角度來看,這可能非常危險,所以大多數基本的Web託管服務提供商都不會啓用此選項。

這是php man page on using cURL。在評論中你可以找到一個下載和圖像文件的例子。

如果你不想使用libcurl,你可以使用fsockopen編寫代碼。這是內置到PHP(但可能會禁用您的主機),並可以直接讀取和寫入套接字。見Examples on the fsockopen man page

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變量並且不要將文件保存到磁盤。

+2

使用curl是一種很好的方法,因爲一些服務器傢伙不支持file_get_contents出於安全原因 – 2012-02-20 09:10:41

2

新建文件夾並將其命名爲敵人例如下載 打開記事本並插入該代碼

只能改變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

你會在下載文件夾中看到來自其他服務器的文件下載

感謝

26

使用

$imageString = file_get_contents("http://example.com/image.jpg"); 
$save = file_put_contents('Image/saveto/image.jpg',$imageString); 
0

我試圖複製/使用複製功能behint代理下載遠程文件,但複製無需代理直接連接。

我試圖將我的設置設置爲默認上下文,並將其作爲3.函數參數進行復制。

但是看起來上下文從未使用,但readfileget_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)); 

我的服務器與運行:

  • 的Windows XP SP3
  • 的Apache 2.2.12(作爲服務運行)
  • PHP 5.3。 0(API20090626,TS,VC6)(配置爲apache模塊)

已啓用urlfopen http和https流注冊爲php

-2

This answer幫助我將圖像從服務器下載到客戶端。

<a download="original_file.jpg" href="file/path.jpg"> 
    <img src="file/path.jpg" class="img-responsive" width="600" /> 
</a> 
0

對於那些誰需要保留原始文件名和擴展

$origin = 'http://example.com/image.jpg'; 

$filename = pathinfo($origin, PATHINFO_FILENAME); 
$ext = pathinfo($origin, PATHINFO_EXTENSION); 

$dest = 'myfolder/' . $filename . '.' . $ext; 

copy($origin, $dest); 
相關問題