2011-09-06 114 views
10

我正在使用Google App Engine Blobstore來存儲一系列文件類型(PDF,XLS等),並試圖找到上傳文件的原始文件名 - 存儲在blob_info中 - 可用於命名下載的文件,即用戶在保存對話框中看到'some_file.pdf'而非'very_long_db_key.pdf'。使用Google App Engine下載的文件名Blobstore

我不能看到任何文檔將允許這樣的:

http://code.google.com/appengine/docs/python/blobstore/overview.html

我見過的其他職位的提示,你可以在blob_info使用這些信息來設置內容部署頭。這是達到預期目標的最佳方法嗎?

回答

11

send_blob函數中有一個可選的'save_as'參數。默認情況下,它被設置爲False。將其設置爲True將導致文件被視爲附件(即它會觸發「保存/打開」下載對話框),用戶將看到正確的文件名。

例子:

class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, resource): 
     resource = str(urllib.unquote(resource)) 
     blob_info = blobstore.BlobInfo.get(resource) 
     self.send_blob(blob_info,save_as=True) 

也可以通過傳遞一個字符串覆蓋的文件名:

self.send_blob(blob_info,save_as='my_file.txt') 

如果你想要一些內容(如PDF)打開,而不是拯救你可以使用CONTENT_TYPE來確定行爲:

blob_info = blobstore.BlobInfo.get(resource) 
type = blob_info.content_type 
if type == 'application/pdf':  
    self.response.headers['Content-Type'] = type 
    self.send_blob(blob_info,save_as=False) 
else: 
    self.send_blob(blob_info,save_as=True) 
+0

只需添加 - 如果原始文件名包含雙引號,則下載對話框將在引號字符後截斷文件名。我已經通過轉義blob文件名中的雙引號來解決這個問題: 'self.send_blob(blob_info,save_as = blob_info.filename。替換(''','\\'''))' (這裏有一個相關的討論[here](http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter -of-content-disposition-header-in-http)) –

0

是的,這是最好的方法;只需使用給定的Blobstore鍵查詢BlobInfo對象並使用其屬性即可。

1

另一個選項是將文件名追加到下載URL的末尾。例如:

/files/AMIfv95HJJY3F75v3lz2EeyvWIvGKxEcDagKtyDSgQSPWiMnE0C2iYTUxLZlFHs2XxnV_j1jdWmmKbSVwBj6lYT0-G_w5wENIdPKDULHqa8Q3E_uyeY1gFu02Iiw9xm523Rxk3LJnqHf9n8209t4sPEHhwVOKdDF2A/prezents-list.doc 

如果您使用的Jinja2的模板,你可以構建這樣的URL是這樣的:

<a href="/files/{{blob_info.key()}}/{{blob_info.filename}}">{{file.filename}}</a> 

,那麼你應該相應地調整你的URL映射到這樣的事情:

('/files/([^/]+)/?.*', DownloadHandler) 

如果在URL中有blob鍵,則可以忽略服務器端代碼中的文件名。

這種方法的好處是,可以直接在瀏覽器中打開圖像或PDF等內容類型,便於快速查看。其他內容類型將被保存到磁盤。

相關問題