我正在尝试找到一个直接获取文件的解决方案,例如 wget ,而不是从流中读取并写入另一个文件,但我不确定这是否可行。
有什么建议吗?
答案 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写入本地文件......