как я могу скачать файл с Zend_Http_Client или другой библиотекой - PullRequest
1 голос
/ 10 сентября 2010

Я пытаюсь найти решение, чтобы получить файл напрямую, как wget вместо чтения из потока и записи в другой файл, но я не уверен, возможно ли это.

Есть предложения?

Ответы [ 4 ]

3 голосов
/ 10 сентября 2010

Я также обнаружил copy , который позволяет копировать файл с URL-адреса непосредственно на ваш диск и является одним из способов без сложностей в curl или необходимости создания пустого файла, куда передавать содержимое file_get_contents.

copy($file_url, $localpath);
1 голос
/ 10 сентября 2010

file_put_contents ($ local_path, file_get_contents ($ file_url));

также является одним вкладышем; -)

Единственная проблема с указанным кодом может бытьочень большие файлы: в этом случае копирование может быть лучше, но см. также http://www.php.net/manual/en/function.copy.php#88520

Требуется некоторое тестирование ...

1 голос
/ 10 сентября 2010

С помощью CURLOPT_FILE вы можете записать некоторый файловый поток прямо в открытый дескриптор файла (см. curl_setopt ).

/**
 * @param string $url
 * @param string $destinationFilePath
 * @throws Exception
 * @return string
 */
protected function _downloadFile($url, $destinationFilePath)
{
    $fileHandle = fopen($destinationFilePath, 'w');

    if (false === $fileHandle) {
        throw new Exception('Could not open filehandle');
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FILE, $fileHandle);

    $result = curl_exec($ch);
    curl_close($ch);
    fclose($fileHandle);

    if (false === $result) {
        throw new Exception('Could not download file');
    }

    return $destinationFilePath;
}

Редактировать на основе ваших комментариев:
Если вы хотитеoneliner или хотите использовать wget, позвоните через exec () или system () примерно так:

exec('wget http://google.de/ -O google.html -q') 

Изменить для дальнейшего использования:

<?php
function downloadCurl($url, $destinationFilePath)
{
    $fileHandle = fopen($destinationFilePath, 'w');

    if (false === $fileHandle) {
        throw new Exception('Could not open filehandle');
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FILE, $fileHandle);

    $result = curl_exec($ch);
    curl_close($ch);
    fclose($fileHandle);

    if (false === $result) {
        throw new Exception('Could not download file');
    }
}


function downloadCopy($url, $destinationFilePath)
{
    if (false === copy($url, $destinationFilePath)) {
        throw new Exception('Could not download file');
    }
}

function downloadExecWget($url, $destinationFilePath)
{
    $output = array();
    $return = null;
    exec(sprintf('wget %s -O %s -q', escapeshellarg($url), escapeshellarg($destinationFilePath)), $output, $return);

    if (1 === $return) {
        throw new Exception('Could not download file');
    }
}

Все три метода имеют примерно одинаковое время выполнения и использование памяти.
Используйте все, что подходит для вашей среды.

0 голосов
/ 10 сентября 2010
$c = file_get_contents('http://www.example.com/my_file.tar.gz');

А теперь напишите $ c в локальный файл ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...