如何使用Zend_Http_Client或其他库下载文件

时间:2010-09-10 11:24:18

标签: php zend-framework download

我正在尝试找到一个直接获取文件的解决方案,例如 wget ,而不是从流中读取并写入另一个文件,但我不确定这是否可行。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

我还发现copy允许将文件从网址直接复制到您的磁盘,并且是一个oneliner,没有curl的复杂性或者需要创建一个空文件来传输file_get_contents的内容。< / p>

copy($file_url, $localpath);

答案 1 :(得分:1)

使用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');
    }
}

这三种方法的运行时间和内存使用率几乎相等 使用最适合您环境的任何东西。

答案 2 :(得分:1)

  

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

也是一个班轮; - )

上述代码的唯一问题可能是文件非常大:在这种情况下复制可能会更好,但另请参阅http://www.php.net/manual/en/function.copy.php#88520

需要进行一些测试...

答案 3 :(得分:0)

$c = file_get_contents('http://www.example.com/my_file.tar.gz');

现在将$ c写入本地文件......