📜  PHP上传进度条(1)

📅  最后修改于: 2023-12-03 15:03:44.915000             🧑  作者: Mango

PHP上传进度条

在Web应用程序中,文件上传是一个常见任务。然而,当上传大文件时,用户可能需要等待很长时间,并且不知道上传进度。这时,通过在Web页面中添加一个进度条来显示上传进度,可以提高用户体验。

PHP有很多实现进度条的方法,其中一个较为简单的方法是使用AJAX和Session。

实现方法

首先,需要确保上传表单的enctype属性设置为multipart/form-data,以启用文件上传功能。

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload" name="submit">
</form>

在服务器端,创建一个PHP文件upload.php,处理上传请求。在上传文件之前,启动一个新的会话,以跟踪上传进度。

session_start();

接下来,需要定义一个变量来保存文件上传的进度。可以将该变量保存在会话中。

$_SESSION['progress'] = 0;

使用move_uploaded_file()函数将文件从临时位置移动到指定的目录中。

$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file " . basename($_FILES["fileToUpload"]["name"]) . " has been uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}

在上传文件过程中,通过不断更新会话变量来记录上传进度。

function setProgress($progress) {
    $_SESSION['progress'] = $progress;  //保存上传进度值
    session_write_close();  //保存进度值后立即释放session锁
}

setProgress(0);  //初始化进度为0

$file_size = $_FILES['fileToUpload']['size'];
$bytes_read = 0;
$handle = fopen($_FILES['fileToUpload']['tmp_name'], "r");

while (!feof($handle)) {
    $buffer = fread($handle, 1024 * 1024);  //每次读取1MB数据
    $bytes_read += strlen($buffer);
    setProgress(min(100, 100 * $bytes_read / $file_size));  //计算并更新进度值
}
fclose($handle);

最后,在客户端页面上创建一个AJAX请求,在请求过程中向服务器询问上传进度,并将进度条更新为最新的进度值。

function updateProgress() {
    $.get("progress.php", function(data) {
        $("#progress").attr("value", data);
        $("#percent").html(data + "%");
        if (data < 100) {
            setTimeout('updateProgress()', 1000);
        } else {
            $("#status").html("Upload Completed");
        }
    });
}

其中,progress.php文件是一个简单的PHP脚本,返回会话变量中保存的上传进度值。

session_start();
echo isset($_SESSION['progress']) ? $_SESSION['progress'] : 0;
总结

通过上述方法,可以简单地实现一个PHP上传进度条。这将增强用户体验,提高应用程序的可用性。