PHP远程下载文件
目录
在这个例子中,我添加了一个进度条的HTML和CSS部分,以及一个JavaScript函数 updateProgressBar,该函数用于更新进度条的状态。progressCallback 函数在下载过程中通过调用该JavaScript函数来更新进度条的状态。这样,你就可以在页面上看到一个动态的进度条。但由于PHP是服务器端语言,而浏览器是在收到完整响应后才开始渲染页面的,因此在文件下载过程中动态显示进度条可能会有些困难。
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { // 获取用户输入的下载地址 $fileUrl = $_POST["fileUrl"]; // 检查下载地址是否为空 if (empty($fileUrl)) { echo "请提供文件下载地址。"; } else { // 获取文件名 $fileName = basename($fileUrl); // 保存文件到当前目录 $savedFilePath = __DIR__ . '/' . $fileName; // 初始化cURL会话 $ch = curl_init($fileUrl); // 打开文件句柄用于保存文件 $fileHandle = fopen($savedFilePath, 'w'); // 设置cURL参数 curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_setopt($ch, CURLOPT_NOPROGRESS, false); curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback'); curl_setopt($ch, CURLOPT_FILE, $fileHandle); // 执行cURL会话 curl_exec($ch); // 关闭文件句柄 fclose($fileHandle); // 关闭cURL会话 curl_close($ch); // 检查文件是否成功保存 if (file_exists($savedFilePath)) { echo "文件下载成功。"; } else { echo "文件下载失败。"; } } } function progressCallback($resource, $download_size, $downloaded, $upload_size, $uploaded) { if ($download_size > 0) { $progress = round(($downloaded / $download_size) * 100, 2); echo "<script>updateProgressBar({$progress})</script>"; ob_flush(); flush(); } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>远程文件下载</title> <style> #progress-container { width: 300px; border: 1px solid #ccc; margin-top: 10px; display: none; } #progress-bar { width: 0; height: 20px; background-color: #4CAF50; text-align: center; line-height: 20px; color: white; } </style> </head> <body> <h1>远程文件下载</h1> <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <label for="fileUrl">文件下载地址:</label> <input type="text" name="fileUrl" id="fileUrl" required> <button type="submit">下载文件</button> </form> <div id="progress-container"> <div id="progress-bar">0%</div> </div> <script> function updateProgressBar(progress) { var progressBar = document.getElementById("progress-bar"); progressBar.style.width = progress + "%"; progressBar.innerHTML = progress + "%"; if (progress === 100) { document.getElementById("progress-container").style.display = "none"; } else { document.getElementById("progress-container").style.display = "block"; } } </script> </body> </html>