2012-06-15 27 views
2

整個問題在標題中非常多。cgi.FieldStorage類如何與文件上傳一起使用?

我可以找到類的唯一文檔是非常cgi documentation它不會在課堂上如何接收文件,它是如何存儲在至少提,哪些功能支持等

我對上傳的文件存儲位置非常感興趣。顯然它不在內存中,因爲Bottle提到FileStorage.read()函數在大文件上是危險的。如果將它放在磁盤上,我想將它移到永久位置,而不必通過Python讀取它,將它一點一點地複製到一個新位置。

但是我不知道從哪裏開始,因爲這個班的文檔很差。有任何想法嗎?

回答

-1

FieldStorage.file屬性實際上不是一個文件,而是一個cStringIO對象,這是對文檔描述爲內存文件http://docs.python.org/library/stringio.html

也許這可以幫助你一點。

+0

如果是這樣的話,我怎麼可以上傳4GB的磁盤映像,並且Python進程始終保持15M的內存使用率?再次,bottle文檔警告不要使用'FileStorage.read',因爲它會「將整個文件讀入內存」。如果文件已經在內存中,那就不會有問題了,我想。 – Hubro

+0

對我的評論有何反應? – Hubro

+0

我試着從[源文件](http://hg.python.org/releasing/2.7.3/file/7bb96963d067/Lib/cgi.py#l328)閱讀它,顯然你是對的!它似乎只使用StringIO進行緩衝。註釋說如果你想移動臨時文件,你應該重寫一些類的方法,但我不知道你可以讓WSGI框架使用不同的'cgi'實現。 – moschlar

2

有點晚了,但看着這個自己:

這一切都歸結到「make_file的方法在cgi.py:

def make_file(self, binary=None): 
    import tempfile 
    return tempfile.TemporaryFile("w+b") 

的臨時文件文檔(http://docs.python.org/2/library/tempfile.html)確定該文件是在從依賴於平臺的列表中選擇的默認目錄中創建的,但用戶可以通過設置其中一個環境變量來控制目錄位置:TMPDIR,TEMP或TMP。

另外請注意,從文檔:

在Unix下,在文件被創建後該文件的目錄項被立即刪除 。其他平臺不支持這個;您的 代碼不應該依賴使用此函數創建的臨時文件 在文件系統中具有或不具有可見名稱。

希望這會有所幫助。

相關問題