项目

通用

个人资料

操作

模块 mod_uploadprogress

描述

已废弃 mod_uploadprogress 应由 lua mod_uploadprogress 替代

独立于上传请求跟踪文件上传的进度

选项

upload-progress.progress-url

字符串,默认为空;使用 “/progress”(或其他值)启用此模块

配置示例

upload-progress.progress-url = "/progress" 

警告

如果您使用多个工作进程(“server.max-worker”:Server.max-workerDetails),此模块将无法工作

备注

从版本 1.4.42 开始,此模块可用于跟踪当前上传的进度。

如果您想跟踪文件上传的进度,则需要调用
您的上传处理 URL,并带有一个名为 X-Progress-ID 的额外参数
其值为一个 32 字节长度的唯一字符串。

https://www.my-domain.com/uploadfile.php?X-Progress-ID=abcdefghabcdefghabcdefghabcdefgh

在上传过程中,您可以使用上述参数通过 GET 方法访问您的上传进度 URL。
参数使用GET方法。

如果您未使用 GET 方法或参数长度不是 32,
您将收到 404 响应。

https://www.my-domain.com/progress?X-Progress-ID=abcdefghabcdefghabcdefghabcdefgh

如果不存在该标识符的上传进度,您将收到
以下响应(不带引号):“not in progress”。

如何使用

生成一个 progress-id(32 位十六进制数字 - 只需使用 MD5 哈希);在上传请求和所有进度请求中发送此 progress-id,作为 “X-Progress-ID” 头或 “X-Progress-ID” 查询字符串参数。

XML 响应

返回的 XML 将如下所示

<?xml version="1.0" encoding="iso-8859-1"?><upload><size>14953670</size><received>391182</received></upload>

示例 1

附带了三个 HTML 文件作为示例,基于 Jan 提及的工作
在上面的链接中。您需要添加 tracking_id(一个关于如何通过单页上传和 JavaScript 来完成此操作的示例也提供在 Jan 的博客中)。
通过单页上传完成,JavaScript代码也提供在Jan的博客上)。

在 iframe 版本中,您可以通过 PHP 或其他服务器端脚本生成 tracking_id。
服务器端脚本。

警告,这些文件无法直接使用,您需要进行修改!

下载

示例 2

此示例在设计时考虑了最大兼容性,甚至可在 Internet Explorer 5.0 中运行。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>File upload progress</title>
</head>
<body>
  <form action="?X-Progress-ID=a2345678901234567890123456789012" method="POST" enctype="multipart/form-data" id="upload" target="upload_frame">
    <input type="file" name="file">
    <input type="submit">
  </form>
  <iframe width="0" height="0" frameborder="0" scrolling="no" name="upload_frame" id="upload_frame"></iframe>
  <p id="state"></p>
<script>
function get_state() {
  var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');

  function handle_request() {
    if (xhr.readyState != 4) {
      return;
    }
    var v = xhr.responseText;
    if (v === 'not in progress') {
      state.innerHTML = 'done';
      clearInterval(timer);
      return;
    }
    var arr = reg.exec(v);
    state.innerHTML = Math.floor(100 * arr[2] / arr[1]) + '%';
  }

  xhr.open('GET', '/progress', true);
  xhr.setRequestHeader('X-Progress-ID', 'a2345678901234567890123456789012');
  xhr.onreadystatechange = handle_request;
  xhr.send();
}

function start_interval() {
  timer = setInterval(get_state, 1000);
}

var upload = document.getElementById('upload'), state = document.getElementById('state'), upload_frame = document.getElementById('upload_frame'),
f = upload_frame.contentWindow, reg = new RegExp('size>([0-9]+)</size><received>([0-9]+)</rec'), timer;

upload.onsubmit = start_interval;
</script>
</body>
</html>

更新者 gstrauss 约 3 年 前 · 22 次修订