模块 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。
服务器端脚本。
警告,这些文件无法直接使用,您需要进行修改!
下载- index.html - 主页
index.html
- status.html - 包含进度的页面
status.html
- upload.html - 上传文件的页面
upload.html
示例 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>