web-dev-qa-db-ja.com

リモートサーバーにファイルをダウンロードしてローカルに保存するには、phpスクリプトが必要です

リモートサーバーにファイルをダウンロードして、ローカルサブディレクトリに保存しようとしています。

次のコードは、1 MB未満の小さなファイルで機能するようですが、大きなファイルはタイムアウトし、ダウンロードも開始されません。

<?php

 $source = "http://someurl.com/afile.Zip";
 $destination = "/asubfolder/afile.Zip";

 $data = file_get_contents($source);
 $file = fopen($destination, "w+");
 fputs($file, $data);
 fclose($file);

?>

中断せずに大きなファイルをダウンロードする方法について何か提案はありますか?

18
bigLarry
$ch = curl_init();
$source = "http://someurl.com/afile.Zip";
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);

$destination = "/asubfolder/afile.Zip";
$file = fopen($destination, "w+");
fputs($file, $data);
fclose($file);
32
Parris Varney

PHP 5.1.0以降、file_put_contents()は$ dataパラメータとしてストリームハンドルを渡すことにより、ピース単位での書き込みをサポートします:

file_put_contents("Tmpfile.Zip", fopen("http://someurl/file.Zip", 'r'));
5
Kuldeep

PHPのメモリ制限に簡単に達してしまう可能性があるため、大きなバイナリファイルには_file_get_contents_を使用しないでください。私はexec()wgetにURLと必要な出力ファイル名を伝えることによって:

_exec("wget $url -O $filename");
_
5

私はいつもこのコードを使用していますが、うまく機能しています。

<?php
define('BUFSIZ', 4095);
$url = 'Type The URL Of The File';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>     
2
Hbirjand

ダウンロードするファイルの形式がわからない場合は、このソリューションを使用してください。

$url = 'http:://www.sth.com/some_name.format' ;
$parse_url = parse_url($url) ;
$path_info = pathinfo($parse_url['path']) ;
$file_extension = $path_info['extension'] ;
$save_path = 'any/local/path/' ;
$file_name = 'name' . "." . $file_extension ;
file_put_contents($save_path . $file_name , fopen($url, 'r'))
1
Salar

ファイルをストリーミングする、より良くて軽いスクリプト:

<?php

$url  = 'http://example.com/file.Zip'; //Source absolute URL
$path = 'file.Zip'; //Patch & file name to save in destination (currently beside of PHP script file)

$fp = fopen($path, 'w');

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);

$data = curl_exec($ch);

curl_close($ch);
fclose($fp);

?>
0
Saeed Sepehr

PhpRFTを試してください: http://sourceforge.net/projects/phprft/files/latest/download?source=navbar

それは、progress_barと単純なファイル名detactorがあります...

0
aditya4447