2014-02-07 23 views
1

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

#!/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类型image/svg+xml
  • 加入binary
  • 使用Python StringIOgzip库手动压缩SVG的Content-Transfer-Encoding指令设置更换Content-Type指令打印前的数据

更新

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

回答

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服务器的限制(用于安全或其他测试目的)。

+0

好学的东西! :) –