我正在尋找一種簡單的方法來將圖像從遠程服務器導入到使用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