一个用于获取大文件上传统计信息的WSGI中间件,并为您的用户提供进度条
项目描述
还提供了一个演示页面。
如果您发现了错误,请提交一个问题。
描述
gp.fileupload是一组用于处理大文件上传的WSGI中间件。
gp.fileupload.FileUpload是一个获取服务器上上传的大文件状态的WSGI中间件。提供可选的JavaScript代码来动画化进度条。
gp.fileupload.Storage 是一个 wsgi 中间件,用于在文件系统上存储文件,以避免在您的应用程序中进行大事务。
上传中间件
其原理是在 wsgi 循环中计数上传的块,将它们传输到应用程序,并提供一个带有最新 json 信息的链接。可选的javascript代码可以使用现有的表单并在上传期间替换它为进度条。它还可以生成自己的上传表单,然后使用多个进度条依次上传多个文件。gp.fileupload 可以在不修改您应用程序的情况下使用,只需将其添加到 wsgi 栈中。
目前已与 Pylons 和 Zope 3 进行了测试。
中间件
使用中间件包装您的 wsgi 应用程序
>>> from gp.fileupload import FileUpload >>> def my_application(environ, start_response): ... start_response('200 OK', [('Content-Type', 'txt/html')]) ... return ['<html><body>My app</body></html>'] >>> app = FileUpload(my_application, tempdir=TEMP_DIR, ... max_size=None) >>> def application(environ, start_response): ... return app(environ, start_response)
FileUpload 中间件有以下选项
tempdir:临时文件夹的路径
max_size:最大允许大小。如果文件大小大于 max_size,则会引发 RuntimeError。
include_files:中间件应包含在您的 HTML 主体中的静态文件列表(见下文)。您可能希望在相关页面上自行包含这些文件,否则它们将包含在您的所有页面中。
require_session:一个布尔标志,用于禁用不提供 SESSION_name 查询的请求的中间件。
应用程序代码
编写如下 html 表单
<form enctype="multipart/form-data" method="POST" action=".?gp.fileupload.id=1"> <input type="file" name="file" /> <input type="submit" /> </form>
其中 1 是会话 id。会话 id 必须 是数字。
当表单提交时,您可以使用一些ajax内容通过 url 获取上传的统计信息
http://yourhost/gp.fileupload.stat/1
这将返回一些 JSON 数据,如下
{'state': 1, 'percent': 69}
state 可以有以下值
0:尚未执行任何操作。
1:上传正在激活
-1:文件大于 max_size。
您可以使用此信息显示上传进度。
存储中间件
存储中间件提供了一种避免在您的应用程序中执行长时间事务的方法。
POST 内容写入临时目录。如果 POST 包含文件,则文件将被移动到存储目录。文件内容被替换为相对于存储根的实际文件路径。
这样,您的应用程序将始终接收 少量 数据。
用法
使用中间件包装您的 wsgi 应用程序
>>> from gp.fileupload import Storage >>> from gp.fileupload import purge_files >>> import cgi >>> def my_application(environ, start_response): ... """simple app to read the file path from the request and remove it ... from the storage directory ... """ ... if environ['REQUEST_METHOD'] == 'POST': ... fields = cgi.FieldStorage(fp=environ['wsgi.input'], ... environ=environ, ... keep_blank_values=1) ... relative_path = fields['file'].read() ... # remove file from storage ... purge_files(environ, relative_path) ... start_response('200 OK', [('Content-Type', 'txt/html')]) ... return ['<html><body>My app</body></html>'] >>> app = Storage(my_application, ... upload_to='/tmp/share/files', ... tempdir='/tmp/upload_tmp', ... ) >>> def application(environ, start_response): ... return app(environ, start_response)
Storage 中间件有以下选项
upload_to:存储树根目录
tempdir:临时文件夹的路径
exclude_paths:正则表达式列表。所有匹配的 PATH_INFO 将被忽略。如果此参数不为 None,则中间件还将捕获应用程序发送的非 HTML 内容。警告:此选项是实验性的,并且未经充分测试。
require_session:一个布尔标志,用于禁用不提供 SESSION_name 查询的请求的中间件。
粘贴工厂
此包提供了一种在 PasteDeploy 配置文件中使用的过滤器工厂。
工厂提供中间件本身
[pipeline:main] pipeline = fileupload egg:myapp [filter:fileupload] use = egg:gp.fileupload # temporary directory to write streams to tempdir = %(here)s/data/fileupload # file to inject in the html code include_files = fileupload.css jquery.* # if you already have jquery in your application, use this line #include_files = fileupload.css jquery.fileupload.* # max upload size is 50Mo max_size = 50 # use this options to also wrap your application with a Storage middleware #upload_to = %(here)s/storage #exclude_paths = /@@
然后您可以在 /gp.fileupload.static/ 访问javascript内容。
include_files 参数将注入以下标签到您的应用程序中
<link type="text/css" rel="Stylesheet" media="screen" href="/gp.fileupload.static/fileupload.css"/> <script type="text/javascript" src="/gp.fileupload.static/jquery.js"/> <script type="text/javascript" src="/gp.fileupload.static/jquery.fileupload.js"/> <script type="text/javascript" src="/gp.fileupload.static/jquery.fileupload.auto.js"/>
并随意使用ajax内容。请注意,这些标签在 html 主体末尾包含。
可用文件
jquery.js:jquery 1.2.6
jquery.fileupload.js:jQuery().fileUpload 插件。
jquery.fileupload.auto.js:自动将表单标签与 multipart/form-data 编码类型绑定。
fileupload.css:一些用于显示进度条的 CSS。
Ajax内容
描述
提供作为辅助工具的 jQuery 插件。
要使用它,您只需将一个脚本标签添加到您的 HTML 头部部分
<script type="text/javascript"> jQuery(document).ready(function() { jQuery('#sample').fileUpload(); }); </script>
fileUpload 插件有以下选项
- replace_existing_form:用生成的表单替换现有表单。
默认为 false。
submit_label:一般提交按钮的标签。
field_name:用作每个表单的文件字段名的字符串。默认为 file。
- hidden_submit_name:用于位于下面的隐藏字段名的字符串
每个文件字段。隐藏字段应替换缺失的按钮,并由需要按钮名称(绑定到操作)的表单框架(如z3c.form)所必需。默认为提交。
submit_empty_forms:如果为true,则提交包含空文件字段的表单。默认:true。
use_iframes:如果设置为false,则表单将以正常表单的方式提交。如果设置为true,则表单目标变为iframe,页面不会重新加载。
stat_delay:每个统计请求之间的延迟。默认:1500。
success:当所有文件上传完成后,评估的javascript函数。默认函数不执行任何操作。
示例
如果您想使用多个文件表单
<div id="forms"></div> <script type="text/javascript"> jQuery(document).ready(function() { jQuery('#forms').fileUpload({action:'/upload', field_name:'file_field'}) }); </script>
这将显示一个带有可添加文件字段并上传到/upload的表单。表单作为目标以iframe提交,因此在上传后页面不会改变。
如果您已经有表单。这是在jquery.fileupload.auto.js中执行的操作。
<script type="text/javascript"> jQuery(document).ready(function() { jQuery('form[enctype^='multipart/form-data]') .fileUpload({use_iframes: false}); }); </script>
这将在表单上传时显示进度条,然后在上传完成后重定向到应用程序页面。因此,对您来说使用方式完全透明。
贡献者
Gael Pasgrimaud <gael@gawel.org>
Christophe Combelles <ccomb@free.fr>
新闻
1.2 (2012-09-03)
如果您使用Python2.6,请使用json而不是simplejson。
修复中间件以在Windows上工作。
添加一个标志require_session,只有当查询字符串中存在SESSION_NAME时才启用中间件。默认行为是关闭,意味着它像以前一样行为。
1.1
未记录的更改。
1.0
未记录的更改。
0.9 (2010-03-20)
支持具有相同名称和特殊字符的多个文件(由pfalcon提供)
在统计中允许JSON回调(由pfalcon提供)
0.8 (2009-02-20)
修复安装问题
0.7 (2009-02-08)
修复#1. 当环境中有SCRIPT_NAME时,js中的bug
存储改进。(由trollfot提供)
0.6 (2008-11-24)
使用WebOb改进中间件内部。
0.5 (2008-08-28)
支持readline(int)。感谢Tony Caduto提供bug报告。
添加一个隐藏字段,为z3c.form等表单框架提供所需的操作名称。
更新文档
将统计更新延迟提高到1500ms
添加一个选项来替换现有的表单为生成的表单。
将进度文件名从span更改为div
通过添加输入:file更改事件来提高可用性
只处理POST方法
改进存储中间件
0.4 (2008-08-12)
修复egg安装脚本
添加存储模块
0.3 (2008-07-27)
修复代码注入后发送的Content-Length头。
向“添加更多文件”链接添加e.stopPropagation()。
0.2 (2008-07-25)
将docs/文件夹添加到自动生成文档的sphinx
使用jQuery打包版本
IE JavaScript修复
0.1 (2008-07-24)
第一个版本
项目详情
gp.fileupload-1.2.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 03055defdf0974fe5e96551352d3f9182aa41199e641889daf8a031d53f358b6 |
|
MD5 | 82d79a0ee390b2e903026943dc43c0d5 |
|
BLAKE2b-256 | 4678daeb6406e9ab0c68c64fbc368a5b144def447d9ff6622ea233e0f7470493 |