Muszę pobrać plik zdalny za pomocą curl.
Oto przykładowy kod, który mam:
$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);
Ale nie radzi sobie z dużymi plikami, ponieważ najpierw czyta do pamięci.
Czy można przesłać plik bezpośrednio na dysk?
fwrite
wprowadzać dane, ponieważ używaszCURLOPT_FILE
.fwrite
ANDCURLOPT_FILE
. Podanie$fp
wystarczy. Zrobiłem jedno i drugie i skończyło się1
na końcu treści w pliku.fwrite
Używam tej przydatnej funkcji:
Pobranie go z krokiem 4094 bajtów nie zapełni pamięci
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; }
Stosowanie:
$result = download('http://url','path/local/file');
Następnie możesz sprawdzić, czy wszystko jest w porządku:
if (!$result) throw new Exception('Download error...');
źródło
fopen()
zwracający fałsz i limit czasu umieszczasz w pętli while (zadzwońtime()
i zrób obliczenia)stream_copy_to_stream
zamiast ręcznie kopiować zawartość, tworzy krótszy kod. Ani to, ani tamto nie działahttps
(chyba że określono a$context
). Konkretny styl proceduralny - funkcje plików również nie są do końca OOP, a jeśli umieścisz opcje curl w tablicy, i tak będzie wyglądać o wiele czysto.Znajdź poniższy kod, jeśli chcesz pobrać zawartość podanego adresu URL, a także chcesz zapisać ją do pliku.
<?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); ?>
Jeśli chcesz pobrać plik z serwera FTP, możesz użyć rozszerzenia php FTP. Proszę znaleźć poniższy kod:
<?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); ?>
źródło
kiedy
curl
jest używany do pobierania dużego pliku,CURLOPT_TIMEOUT
jest to główna opcja, którą musisz ustawić.CURLOPT_RETURNTRANSFER
musi być prawdą, jeśli otrzymujesz plik taki jak pdf / csv / image itp.Więcej szczegółów znajdziesz tutaj (poprawny adres URL) Curl Doc
Z tej strony:
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
źródło
Możesz użyć tej funkcji, która tworzy tymczasowy plik w systemie plików i zwraca ścieżkę do pobranego pliku, jeśli wszystko działa poprawnie:
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; }
źródło