php 实现远程下载
PHP 实现远程下载的方法
使用 file_get_contents 和 file_put_contents
file_get_contents 函数可以读取远程文件内容,file_put_contents 可以将内容保存到本地文件。这种方法适用于小文件下载。

$remoteFile = 'http://example.com/file.zip';
$localFile = 'downloaded_file.zip';
$fileContent = file_get_contents($remoteFile);
if ($fileContent !== false) {
file_put_contents($localFile, $fileContent);
echo '文件下载成功';
} else {
echo '文件下载失败';
}
使用 cURL 扩展
cURL 提供了更强大的功能,支持更多协议和选项,适合大文件下载或需要更多控制的情况。

$remoteFile = 'http://example.com/file.zip';
$localFile = 'downloaded_file.zip';
$ch = curl_init($remoteFile);
$fp = fopen($localFile, 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch);
curl_close($ch);
fclose($fp);
if ($result) {
echo '文件下载成功';
} else {
echo '文件下载失败';
}
使用 fopen 和流操作
PHP 的流操作可以像处理本地文件一样处理远程文件,适合需要逐块处理数据的情况。
$remoteFile = 'http://example.com/file.zip';
$localFile = 'downloaded_file.zip';
$remoteHandle = fopen($remoteFile, 'rb');
$localHandle = fopen($localFile, 'wb');
if ($remoteHandle && $localHandle) {
while (!feof($remoteHandle)) {
fwrite($localHandle, fread($remoteHandle, 8192));
}
fclose($remoteHandle);
fclose($localHandle);
echo '文件下载成功';
} else {
echo '文件下载失败';
}
注意事项
- 确保 PHP 配置允许 URL fopen(allow_url_fopen=On)
- 大文件下载时考虑内存限制,使用流式处理
- 添加适当的错误处理机制
- 考虑设置超时限制避免长时间等待
- 检查目标目录的写入权限
添加进度显示
使用 cURL 时可以添加进度回调函数显示下载进度。
function progressCallback($resource, $download_size, $downloaded, $upload_size, $uploaded) {
if ($download_size > 0) {
$percent = round($downloaded / $download_size * 100);
echo "下载进度: $percent%\r";
}
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://example.com/file.zip');
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
// 其他 cURL 选项...
选择哪种方法取决于具体需求、文件大小和服务器配置。cURL 通常提供最灵活和可靠的解决方案。






