반응형
curl을 사용하여 대용량 파일 다운로드
curl을 사용하여 원격 파일을 다운로드해야합니다.
내가 가지고있는 샘플 코드는 다음과 같습니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$st = curl_exec($ch);
$fd = fopen($tmp_name, 'w');
fwrite($fd, $st);
fclose($fd);
curl_close($ch);
그러나 먼저 메모리로 읽어 오기 때문에 큰 파일을 처리 할 수 없습니다.
파일을 디스크로 직접 스트리밍 할 수 있습니까?
<?php
set_time_limit(0);
//This is the file where we save the information
$fp = fopen (dirname(__FILE__) . '/localfile.tmp', 'w+');
//Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20",$url));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);
// write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// get curl response
curl_exec($ch);
curl_close($ch);
fclose($fp);
?>
이 편리한 기능을 사용합니다.
4094 바이트 단계로 다운로드하면 메모리가 가득 차지 않습니다.
function download($file_source, $file_target) {
$rh = fopen($file_source, 'rb');
$wh = fopen($file_target, 'w+b');
if (!$rh || !$wh) {
return false;
}
while (!feof($rh)) {
if (fwrite($wh, fread($rh, 4096)) === FALSE) {
return false;
}
echo ' ';
flush();
}
fclose($rh);
fclose($wh);
return true;
}
용법:
$result = download('http://url','path/local/file');
그런 다음 모든 것이 정상인지 확인할 수 있습니다.
if (!$result)
throw new Exception('Download error...');
지정된 URL의 내용을 다운로드하려면 아래 코드를 찾아 파일에 저장하십시오.
<?php
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,'http://news.google.com/news?hl=en&topic=t&output=rss');
$fp = fopen('rss.xml', 'w+');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec ($ch);
curl_close ($ch);
fclose($fp);
?>
FTP 서버에서 파일을 다운로드하려면 php FTP 확장을 사용할 수 있습니다. 아래 코드를 찾으십시오.
<?php
$SERVER_ADDRESS="";
$SERVER_USERNAME="";
$SERVER_PASSWORD="";
$conn_id = ftp_connect($SERVER_ADDRESS);
// login with username and password
$login_result = ftp_login($conn_id, $SERVER_USERNAME, $SERVER_PASSWORD);
$server_file="test.pdf" //FTP server file path
$local_file = "new.pdf"; //Local server file path
##----- DOWNLOAD $SERVER_FILE AND SAVE TO $LOCAL_FILE--------##
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
echo "Successfully written to $local_file\n";
} else {
echo "There was a problem\n";
}
ftp_close($conn_id);
?>
curl
큰 파일을 다운로드하는 데 사용되는 경우 는 CURLOPT_TIMEOUT
설정해야하는 주요 옵션입니다.
CURLOPT_RETURNTRANSFER
pdf / csv / image 등과 같은 파일을받는 경우에는 사실이어야합니다.
자세한 내용은 여기 (올바른 URL) Curl Doc
From that page:
curl_setopt($request, CURLOPT_TIMEOUT, 300); //set timeout to 5 mins
curl_setopt($request, CURLOPT_RETURNTRANSFER, true); // true to get the output as string otherwise false
You can use this function, which creates a tempfile in the filesystem and returns the path to the downloaded file if everything worked fine:
function getFileContents($url)
{
// Workaround: Save temp file
$img = tempnam(sys_get_temp_dir(), 'pdf-');
$img .= '.' . pathinfo($url, PATHINFO_EXTENSION);
$fp = fopen($img, 'w+');
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
curl_close($ch);
fclose($fp);
return $result ? $img : false;
}
참고URL : https://stackoverflow.com/questions/6409462/downloading-a-large-file-using-curl
반응형
'Programing' 카테고리의 다른 글
ng-click으로 확인란을 클릭해도 모델이 업데이트되지 않습니다. (0) | 2020.09.20 |
---|---|
Javascript에서 DOM 노드 목록을 배열로 변환하는 방법은 무엇입니까? (0) | 2020.09.20 |
httpclient 호출에서 콘텐츠 본문을 가져 오는 방법은 무엇입니까? (0) | 2020.09.20 |
jQuery Validate Plugin-단일 필드의 유효성 검사 트리거 (0) | 2020.09.20 |
TypeScript : 유형 시스템 문제 (0) | 2020.09.20 |