Python CGI脚本只打印部分数据

时间:2014-02-07 19:51:17

标签: html webkit

我有一个简单的Web表单,它将div(一个SVG文档)的内容发送到以下Python脚本。该脚本获取SVG数据并将其打印到浏览器。然后客户端将其保存为文件:

#!/usr/bin/python

import cgi, cgitb, urllib

form = cgi.FieldStorage()
try:
    data = urllib.unquote(form.getvalue('output-data'))
    fn = urllib.unquote(form.getvalue('output-fn'))
except AttributeError:
    data = None
    fn = None

print "Content-Type: application/x-gzip"
print "Content-Disposition: attachment; filename=" + str(fn) 
print "Content-Description: File to download\n"
print data;

以下是表格:

<form id="form-figure-export-svg" action="assets/src/exportSvg.py" method="POST" style="display:none;" enctype="multipart/form-data">
    <input type="text" id="form-figure-svg-data" name="output-data" style="">
    <input type="text" id="form-figure-svg-fn" name="output-fn" style="">
</form>

问题是如果表单包含大量数据(大约450-500 KB - 实际上是524288字节;请参阅下面的更新),那么Python脚本打印的数据将被截断。这会破坏SVG输出。 Chrome和Safari浏览器会在不同的位置截断 - 最新版本的Firefox似乎可以正常运行。

我确认表单中的数据在提交给Python脚本之前是正确的(例如console.log($('#form-figure-svg-data').val()))。

我是否需要在Python脚本中添加一些参数,以确保打印data的完整内容?

我尝试过的其他事情:

  • 用MIME类型Content-Type
  • 替换image/svg+xml指令
  • 添加Content-Transfer-Encoding
  • binary指令设置
  • 使用Python StringIOgzip库在打印前手动压缩SVG数据

更新

在检查Webkit浏览器(Chrome和Safari)的输出时,这可能是由于input字段的最大长度限制(524288字节)。我正在调查是否有办法删除此限制,或使用其他方法通过表单发送我的数据而没有人为限制。

1 个答案:

答案 0 :(得分:1)

所以看起来这个问题与Chrome和Safari(Webkit浏览器)中input div允许的最大长度有关。即,限制为524288字节。

为了解决这个问题,我用textarea div替换了表单中的数据字段,这消除了这个限制:

<form id="form-figure-export-svg" action="assets/src/exportSvg.py" method="POST" style="display:none;" enctype="multipart/form-data">
    <textarea id="form-figure-svg-data" name="output-data" style=""></textarea>
    <input type="text" id="form-figure-svg-fn" name="output-fn" style="">
</form>

当我提交此表单时,通过Chrome和Safari通过表单发送的数据不再受客户端限制。但是,我仍然可以对表单数据的允许大小实施基于Web服务器的限制(出于安全性或其他测试目的)。

相关问题