要下載遠端檔案回自己伺服器存放,方法很多,用fopen也行,但這裡不推薦,因為大部分虛擬主機的php.ini中allow_url_fopen都會設為Off,導致fopen函數擷取遠端檔案失敗,無法下載,解決方法就是使用安全性較高且為PHP預設套件curl函數來擷取遠端檔案,方法如下
假設我們要下載遠端的
https://img.youtube.com/vi/sDhU6nWWja8/maxresdefault.jpg
存放到伺服器端
/opt/lampp/htdocs/uploads/images/maxresdefault.jpg
//function code
//下載遠端檔案回本地端
function curlsave_file($inPath,$outPath){
//$inPath 遠端路徑
//$outPath 儲存本地端路徑
set_time_limit(0); //如果文件很大,請設置超時。
//文件處理
$new_file = fopen($outPath, "w") or die("cannot open" . $outPath);
//curl操作
$cd = curl_init();
curl_setopt($cd, CURLOPT_URL, $inPath);
curl_setopt($cd, CURLOPT_FILE, $new_file);
// 超時為 30 秒,要下載大文件,您可能需要增加超時限制。
curl_setopt($cd, CURLOPT_TIMEOUT, 30);
//運行 curl 下載文件
curl_exec($cd);
if (curl_errno($cd)) {
echo "the cURL error is : " . curl_error($cd);
} else {
$status = curl_getinfo($cd);
echo $status["http_code"] == 200 ? "The File is Downloaded" : "The error code is : " . $status["http_code"] ;
// the http status 200 means everything is going well. the error codes can be 401, 403 or 404.
}
//以上綠色code如不需要使用可以註解掉
//關閉並完成操作。
curl_close($cd);
fclose($new_file);
}
在PHP檔呼叫curlsave_file函數function
$inPath='https://img.youtube.com/vi/sDhU6nWWja8/maxresdefault.jpg';
$outPath='/opt/lampp/htdocs/uploads/images/maxresdefault.jpg';
curlsave_file($inPath,$outPath);
這樣curl擷取遠端檔案後,就會吧檔案存放在本地端目錄了,有需要的朋友可以參考看看
參考資料來源:https://www.delftstack.com/zh-tw/howto/php/php-curl-file-download/
工作心得撰寫:徐嘉裕 Neil hsu
留言
張貼留言