2014-02-07 27 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

好學的東西! :) –