[php] URL에서 서버로 파일 다운로드

글쎄요, 이것은 매우 단순 해 보입니다. 서버로 파일을 다운로드하기 위해해야 ​​할 일은 다음과 같습니다.

file_put_contents("Tmpfile.zip", file_get_contents("http://someurl/file.zip"));

하나의 문제 만 있습니다. 100mb와 같은 큰 파일이 있으면 어떻게해야합니까? 그런 다음 메모리가 부족하여 파일을 다운로드 할 수 없습니다.

내가 원하는 것은 파일을 다운로드 할 때 디스크에 파일을 쓰는 방법입니다. 그렇게하면 메모리 문제가 발생하지 않고 더 큰 파일을 다운로드 할 수 있습니다.



답변

PHP 5.1.0부터는 file_put_contents()스트림 핸들을 $data매개 변수 로 전달하여 조각 단위로 쓰기를 지원합니다 .

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

매뉴얼에서 :

경우 데이터 [즉, 두 번째 인자 인] 스트림 자원, 즉 스트림의 나머지 버퍼 지정된 파일에 복사한다. 이것은을 사용하는 것과 비슷
stream_copy_to_stream()합니다.

( Hakre 감사 합니다 .)


답변

private function downloadFile($url, $path)
{
    $newfname = $path;
    $file = fopen ($url, 'rb');
    if ($file) {
        $newf = fopen ($newfname, 'wb');
        if ($newf) {
            while(!feof($file)) {
                fwrite($newf, fread($file, 1024 * 8), 1024 * 8);
            }
        }
    }
    if ($file) {
        fclose($file);
    }
    if ($newf) {
        fclose($newf);
    }
}


답변

cURL을 사용해보십시오

set_time_limit(0); // unlimited max execution time
$options = array(
  CURLOPT_FILE    => '/path/to/download/the/file/to.zip',
  CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
  CURLOPT_URL     => 'http://remoteserver.com/path/to/big/file.zip',
);

$ch = curl_init();
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

확실하지 않지만 CURLOPT_FILE데이터를 가져올 때 쓰는 옵션, 즉 믿습니다 . 버퍼링되지 않았습니다.


답변

prodigitalson의 답변이 효과 가 없었습니다. 더 자세한 정보를 얻었습니다missing fopen in CURLOPT_FILE .

이것은 로컬 URL을 포함하여 저에게 효과적이었습니다.

function downloadUrlToFile($url, $outFileName)
{
    if(is_file($url)) {
        copy($url, $outFileName);
    } else {
        $options = array(
          CURLOPT_FILE    => fopen($outFileName, 'w'),
          CURLOPT_TIMEOUT =>  28800, // set this to 8 hours so we dont timeout on big files
          CURLOPT_URL     => $url
        );

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        curl_close($ch);
    }
}


답변

  1. 대상 서버에 “다운로드”라는 폴더를 만듭니다.
  2. [이 코드]를 .php파일 로 저장하고 대상 서버에서 실행

다운로더 :

<html>
<form method="post">
<input name="url" size="50" />
<input name="submit" type="submit" />
</form>
<?php
    // maximum execution time in seconds
    set_time_limit (24 * 60 * 60);

    if (!isset($_POST['submit'])) die();

    // folder to save downloaded files to. must end with slash
    $destination_folder = 'downloads/';

    $url = $_POST['url'];
    $newfname = $destination_folder . basename($url);

    $file = fopen ($url, "rb");
    if ($file) {
      $newf = fopen ($newfname, "wb");

      if ($newf)
      while(!feof($file)) {
        fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
      }
    }

    if ($file) {
      fclose($file);
    }

    if ($newf) {
      fclose($newf);
    }
?>
</html> 


답변

set_time_limit(0);
$file = file_get_contents('path of your file');
file_put_contents('file.ext', $file);


답변

세 가지 방법이 있습니다.

  1. file_get_contents 및 file_put_contents
  2. 곱슬 곱슬하다
  3. 열다

여기에서 예제 찾을 수 있습니다 .