上传进度 - 有时 $_SESSION[$key] 为空

2024-03-20

我有 Ubuntu 12.04 LTS 并使用 PHP 5.5 和 Apache2 通过 PHP 会话上传进度来实现上传进度。

问题是它有时有效,有时无效。我的意思是有时我在上传开始时直接获得 100% 的进度百分比而没有完成上传(这意味着在这种情况下 $_SESSION[$key] 为空,但为什么?!)

我尝试将 session.upload_progress.cleanup 的值设置为 On 和 Off,但它没有改变任何内容。

您可以通过以下网址自行尝试:
http://138.128.124.172/upload_progress

In the php.ini,我有以下与上传相关的设置:

;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 100M

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20


; Enable upload progress tracking in $_SESSION
; Default Value: On
; Development Value: On
; Production Value: On
; http://php.net/session.upload-progress.enabled
session.upload_progress.enabled = On

; Cleanup the progress information as soon as all POST data has been read
; (i.e. upload completed).
; Default Value: On
; Development Value: On
; Production Value: On
; http://php.net/session.upload-progress.cleanup
session.upload_progress.cleanup = Off

; A prefix used for the upload progress key in $_SESSION
; Default Value: "upload_progress_"
; Development Value: "upload_progress_"
; Production Value: "upload_progress_"
; http://php.net/session.upload-progress.prefix


;session.upload_progress.prefix = "upload_progress_"

; The index name (concatenated with the prefix) in $_SESSION
; containing the upload progress information
; Default Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Development Value: "PHP_SESSION_UPLOAD_PROGRESS"
; Production Value: "PHP_SESSION_UPLOAD_PROGRESS"
; http://php.net/session.upload-progress.name
;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"

; How frequently the upload progress should be updated.
; Given either in percentages (per-file), or in bytes
; Default Value: "1%"
; Development Value: "1%"
; Production Value: "1%"
; http://php.net/session.upload-progress.freq
;session.upload_progress.freq =  "1%"


; The minimum delay between updates, in seconds
; Default Value: 1
; Development Value: 1
; Production Value: 1
; http://php.net/session.upload-progress.min-freq
;session.upload_progress.min_freq = "1"

在 PHP 端:我在页面中有以下代码:进度.php:

session_start();
$key = ini_get("session.upload_progress.prefix") . "myForm";
if (!empty($_SESSION[$key])) {
    $current = $_SESSION[$key]["bytes_processed"];
    $total = $_SESSION[$key]["content_length"];
    echo $current < $total ? ceil($current / $total * 100) : 100;
}
else {
    echo 100;
}

在客户端,我在页面中有以下代码索引.php

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_FILES["userfile"])) {
    // move_uploaded_file()
}
?>

<style>
    #bar_blank {
        border: solid 1px #000;
        height: 20px;
        width: 300px;
    }

    #bar_color {
        background-color: #006666;
        height: 20px;
        width: 0px;
    }

    #bar_blank, #hidden_iframe {
        display: none;
    }
</style>


<html>
    <head>
        <title>File Upload Progress Bar</title>
    </head>
    <body>
        <div id="bar_blank">
            <div id="bar_color"></div>
        </div>
        <div id="status"></div>
        <form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST" id="myForm" enctype="multipart/form-data" target="hidden_iframe">
            <input type="hidden" value="myForm" name="<?php echo ini_get("session.upload_progress.name"); ?>">
            <input type="file" name="userfile"><br>
            <input type="submit" value="Start Upload">
        </form>


        <iframe id="hidden_iframe" name="hidden_iframe" src="about:blank"></iframe>
    </body>
</html>


<script>

function toggleBarVisibility() {
    var e = document.getElementById("bar_blank");
    e.style.display = (e.style.display == "block") ? "none" : "block";
}

function createRequestObject() {
    var http;
    if (navigator.appName == "Microsoft Internet Explorer") {
        http = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else {
        http = new XMLHttpRequest();
    }
    return http;
}

function sendRequest() {
    var http = createRequestObject();
    http.open("GET", "progress.php");
    http.onreadystatechange = function () { handleResponse(http) };
    http.send(null);
}

function handleResponse(http) {
    var response;
    if (http.readyState == 4) {
        response = http.responseText;  //alert(response);return;
        document.getElementById("bar_color").style.width = response + "%";
        document.getElementById("status").innerHTML = response + "%";

        if (response < 100) {
            setTimeout("sendRequest()", 1000);
        }
        else {
            toggleBarVisibility();
            document.getElementById("status").innerHTML = "Done.";

            document.getElementById("bar_color").style.width = 0 + "%";

        }
    }
}

function startUpload() {
    toggleBarVisibility();
    setTimeout("sendRequest()", 1000);
}

(function () {
    document.getElementById("myForm").onsubmit = startUpload;
})();

</script>

我对 HTML5、Jquery 或 flash 不感兴趣。如果您还提示我有关更好的方法来获得稳健的方法来实现带有进度条的上传,我将不胜感激。

感谢您的帮助!


由于答案的大小,我使用回复部分。或者,一些细节的大小...... 事实上,我在 Debian Whezzy 上运行 PHP 5.5.18 时也遇到了同样的问题。

经过一些测试并将日志放入progress.php以保存$key、bytes_processed和content_length的值之后,以下是我的结论:

发现1号:我们没有空钥匙。我们有一个密钥向我们显示 bytes_processed = content_length 的信息

发现2号:如果您下载例如 4 个不同大小的文件,然后查看您的 Progress.php 日志,您将看到第二个文件的会话值将为您提供文件 1 的结果。

例子:

发送 test.docx -> 500.000 字节。 $key 为空

发送 house.jpg -> 4.000.000 字节。 $key 给出 bytes_processed = content_length = 500.000 所以前一个文件的结果

在许多情况下,我们在表单中使用隐藏字段,如下所示:

 echo "<input type=hidden value=\"myForm\" name=\"";  
 echo ini_get("session.upload_progress.name");
 echo "\" />\n";

我们使用in Progress.php获取数据:

 $key = ini_get("session.upload_progress.prefix") . "myForm";

meaning ALL我们的 $key 有相同的名称。 我通过以下方式更改:

 $val = time();
 echo "<input type=hidden value=\"".$val."\" name=\"";  
 echo ini_get("session.upload_progress.name");
 echo "\" />\n";

and

 $key = ini_get("session.upload_progress.prefix") . $_POST[ini_get("session.upload_progress.name")];

现在,每次我都有一把空钥匙。 我的结论是我们有一个缓存问题,正如 PHP.net 所说:

Warning必须禁用 Web 服务器的请求缓冲才能正常工作,否则 PHP 可能仅在完全上传后才能看到文件上传。众所周知,Nginx 等服务器可以缓冲较大的请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

上传进度 - 有时 $_SESSION[$key] 为空 的相关文章

随机推荐

  • 匿名函数和内存消耗

    就内存消耗而言 这些是否等效 或者我们是否为后者中的每个对象获得一个新的函数实例 var f function alert this animal var items for var i 0 i lt 10 i var item anima
  • 如何重置 Apache Archiva 密码

    我正在使用 apache archiva 2 2 0 版本 我丢失了管理员密码 因此我想重置管理员用户的密码 我尝试通过删除下面提到的文件来重置密码 apache archiva 2 2 0 data databases users dbe
  • 检测 pandas.DataFrame 中的列是否是分类的好的启发式是什么?

    我一直在开发一个工具 可以自动预处理 pandas DataFrame 格式的数据 在此预处理步骤中 我想以不同的方式处理连续数据和分类数据 特别是 我希望能够应用 OneHotEncoder 等only分类数据 现在 假设我们提供了一个
  • Python 3 默认编码 cp1252 [重复]

    这个问题在这里已经有答案了 我最近在索尼 vaio windows 10 系统上使用 anaconda 4 1 1 python 3 5 2 安装从 Biopython 模块解码句柄 错误映射 0x81 0x8D 时遇到了一些问题 经过一番
  • bash 逗号分隔值的逆序

    我有以下元素列表 a b c 1337 d e 我希望我有 e d 1337 c b a 我怎样才能在 bash 中实现这一目标 你可以这样做awk bin bash awk BEGIN FS OFS for i NF i gt 0 i p
  • Maven 与 Android - R.java 文件生成 (Eclipse)

    我正在尝试将 R java 生成工作到 gen 文件夹中的项目 实际上 应用程序在使用 maven 构建时构建 但是 eclipse 发现错误 因为它无法解析 R java 文件 实际上在每次构建后放入 target generated s
  • CodeIgniter 和 Oracle 数据库 - ActiveRecord insert() 在查询中添加双引号

    我正在使用 CodeIgniter 框架版本 2 2 和 Oracle 11g 数据库 在database php中我的配置如下所示 与 CodeIgniter 的数据库连接良好 当我尝试使用 CodeIgniter 的 ActiveRec
  • c#图表控件,垂直滚动缩放问题[“Stuck Scroll bar”]

    我有一个带有大型 C 图表控件的程序 我允许用户选择任何区域来进行缩放 它将放大 这一切都很好 当我水平滚动时 这也工作得很好而且非常流畅 但是 当我尝试垂直滚动时 滚动条不会移动 我唯一能做的就是使用滚动条上的向上和向下箭头键 这只会给出
  • 使用 Popen 运行本地二进制文件时出现“文件未找到”错误

    我正在编写一个 Python 程序来使用 Popen 调用本地二进制文件来捕获其输出 我将目录更改为os chdir我已经验证该文件在那里 但是 以下代码引发 找不到文件 异常 谁能告诉我我做错了什么 从不在我的 PATH 中的目录运行程序
  • Raspberry 上的 Libtorch 无法加载 pt 文件,但可以在 ubuntu 上运行

    我正在尝试在 Raspberry PI 上使用 libtorch 构建 C 程序 该程序在 Ubuntu 上运行 但在 Raspberry 上构建时出现以下错误 error use of deleted function void torc
  • 如果 observable 在 X 时间内没有发出值,则会产生副作用

    我正在研究一个用例 要求如果可观察量在一定时间内没有发出值 那么我们应该做一些副作用 给出一个实际用例 打开网络套接字连接 如果在 X 时间内没有发送 接收消息 则关闭 Web 套接字连接并通知用户 这需要在每个发出的值上以及在初始订阅可观
  • 列出表中不同的元组(SQL 查询)(10 种方式)

    有哪些不同的列出方式不同的元组在表格中 原始问题来自高盛说列出 10 种不同的方式 其中一种方式正在使用DISTINCT 任何人都可以帮助我更多 这是四个 GROUP BY
  • 如何在php中使用“for”循环创建动态递增变量?

    如何在php中使用 for 循环创建动态递增变量 同样 track 1 track 2 track 3 track 4 等等 Use parse str http pt php net manual en function parse st
  • 查找不在列表中的最小非负整数的算法

    给定一个整数列表 我怎样才能最好地找到一个整数not在列表中 该列表可能非常大 并且整数也可能很大 即 BigIntegers 而不仅仅是 32 位整数 如果有什么区别 列表 可能 已排序 即 99 的时间都会排序 但我不能依赖总是排序 E
  • wttr.in 对浏览器的响应与对curl 的响应有何不同?

    如果你去http wttr in http wttr in 在浏览器中 您将看到一个包含在标签中 具有链接并使用跨度着色的页面 如果您然后转到终端并输入curl http wttr in 您将得到几乎完全相同的页面 但代码却截然不同 wtt
  • 参数前缀“:”后不允许有空格

    我的问题是我尝试在查询中插入包含 char 的文本 我尝试在 char 之前添加双反斜杠 但仍然不起作用 ABNORMALLY java lang IllegalArgumentException org hibernate QueryEx
  • 新的 TypeScript 版本不包括“window.navigator.msSaveBlob”

    我有一个 TypeScript 项目 https github com jmaister excellentexport https github com jmaister excellentexport 并且工作正常 添加dependab
  • 如何使用Azure Blob存储挂载数据?

    我是 Azure Databricks 的新手 我的导师建议我完成机器学习训练营 https aischool microsoft com en us machine learning learning paths ai platform
  • StackFrame 的性能如何?

    我正在考虑使用类似的东西StackFrame stackFrame new StackFrame 1 记录执行方法 但我不知道它的性能影响 堆栈跟踪是否是在每次方法调用时都会构建的 因此性能不应该成为问题 还是仅在需要时才构建 您是否建议在
  • 上传进度 - 有时 $_SESSION[$key] 为空

    我有 Ubuntu 12 04 LTS 并使用 PHP 5 5 和 Apache2 通过 PHP 会话上传进度来实现上传进度 问题是它有时有效 有时无效 我的意思是有时我在上传开始时直接获得 100 的进度百分比而没有完成上传 这意味着在这