2009-05-31 53 views
1

在cherrypy.lib.static.py有如下方法:serve_file對於任何文件對象

serve_file(path, content_type=None, disposition=None, name=None) 

其中變量「路徑」必須是一個真實的文件(絕對路徑)。有沒有類似的服務任何Python文件對象?

+0

serve_fileobj函數適用於此。 (如果你接受正確的答案,對社區會有所幫助。) – 2012-12-17 12:34:18

回答

3

從學習http://www.cherrypy.org/browser/trunk/cherrypy/lib/static.py我不得不說,不:serve_file函數是「單片」,並且它自己的bodyfile = open(path, 'rb'),似乎也沒有任何替代方法。可惜,因爲它很容易重構函數並添加另一個例如serve_open_file來覆蓋你的情況,既委託給一個內部函數的「硬」邏輯,如multipart/byteranges服務。可能值得你在cherrypy.org上打開一個功能請求(「增強門票」) - 可能不是一個殺手級的功能,但我可以看到使用案例,並且實現它對櫻桃人來說並不難(訪問their site並按照頁面上的說明「登錄」)。

+1

如果我理解正確,我認爲這個答案不再是真實的,增加了'serve_fileobj`方法。 – 2011-09-08 19:59:22

+0

是的,serve_filobj完全符合OP的要求。 (此答案已過時。) – 2012-12-17 12:34:49

2

只要您的文件或文件類對象是可迭代的,只需從您的處理函數而不是字符串中返回即可。

更新:

爲它服務的下載,設置Content-Type和Content-Disposition的頭,像這樣:

cherrypy.response.headers["Content-Type"] = "application/x-download" 
cd = 'attachment; filename="%s"' % name 
cherrypy.response.headers["Content-Disposition"] = cd 

或者,在最新版本的cherrypy/lib/static.py使用serve_fileobj功能,這爲你做了更多。