2015-05-14 74 views
1

我需要從wtforms獲取二進制文件並將其作爲bytea存儲在postgresql中。我不需要將其永久存儲爲文件。根據我對Flask offical doc的理解,我可以通過request.files。['myfile']。filename或secure_filename(f.filename)來訪問文件名。然而,他們兩人給我一個錯誤:IO錯誤:[錯誤2]沒有這樣的文件或目錄:u'myuploadpdf.pdf」無法從secure_filename讀取文件(f.filename)

   f = request.files.['myfile']: 
       if f and allowed_file(f.filename): 
       #filename = secure_filename(f.filename) 
       data = open(f.filename, 'rb').read() 
       #data = open(filename , 'rb').read() 
       binary = psycopg2.Binary(data) 

回答

3

open()需要一個路徑名的文件。由於該文件尚未保存到磁盤,因此不存在此類路徑。 :)

你實際上想要做的是直接撥打f.read()。讀取傳入文件覆蓋here

此外,如果您使用磁盤上的任何東西,請務必使用secure_filename()。不想打開任何目錄遍歷攻擊線。

+0

該文件將被存儲在數據庫中。那麼你是否說我必須在保存到數據庫之前將它存儲在磁盤上,因爲request.files ['myfile']。read()不是安全的。 –

+0

不,您可以轉換它,然後直接保存到Postgres,就像通過'psycopg2.Binary(data)'和您選擇的ORM/insert語句一樣。 我對'secure_filename'的評論只適用於保存到磁盤或從磁盤讀取數據的情況。在處理用戶上傳的內容時,這意味着更多地放在安全性方面。只要你不信任其內容,FileStorage.read就不是固有的不安全。 ;) –

+0

謝謝,但我仍然需要以二進制模式讀取文件:data = open(fn,'rb')。read()以便調用psycopg2.Binary(data),這導致我[這個問題]( http://stackoverflow.com/questions/30245395/typeerror-cant-escape-psycopg2-extensions-binary-to-binary) –

2

在request.files的對象是FileStorage對象和他們有相同的方法作爲python中的普通文件對象。因此,要獲得該文件的內容作爲二進制,試試這樣做:

data = request.files['myfile'].read()