2011-11-18 70 views
1
class PDF(webapp.RequestHandler): 
    def get(self): 
     self.response.headers['Content-Type'] = "application/txt" 
     self.response.headers['Content-Disposition'] = "attachment; filename=file.pdf" 
     f = open('/Users/BP/file.pdf', 'r') 
     self.response.out.write(f.read()) 
def main(): 
    application = webapp.WSGIApplication([('/download', PDF)], 
             debug=False) 
    util.run_wsgi_app(application) 

我得到這個錯誤,當我嘗試下載:谷歌AppEngine上 - 讓用戶下載文件

[Errno 13] Permission denied: '/Users/BP/file.pdf' 
Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 701, in __call__ 
    handler.get(*groups) 
    File "/base/data/home/apps/s~projectname/1.354763951774324185/main.py", line 43, in get 
    f = open('/Users/BP/file.pdf', 'r') 
IOError: [Errno 13] Permission denied: '/Users/BP/file.pdf' 

即使我已經試過chmod a+r file.pdf 請幫助。謝謝!

回答

3

os.path.dirname(__file__)爲您提供應用程序目錄。

f = open(os.path.dirname(__file__) + /'BP/file.pdf', r)

儲存在BP /文件夾中文件的主要文件夾內。

@Nicke,@Jon:GAE允許訪問您的文件。 「願消息來源與你同在」。

+0

你是對的,它的作品像一個魅力:)謝謝! – BPm

+0

GAE中的「正確」方式是在app.yaml中使用靜態文件句柄,如果您喜歡DIY風格,請嘗試使用[Webob](http://docs.webob.org/zh/latest/file-example.html )更有效的例子。 –

+0

我看到有些框架會這樣做,我不確定建議我們在做WSGI時使用'os'module。當然,因爲在UNIX中「一切都是文件」,那麼你自然說我在這裏錯了。而且,如果你想使用os模塊,我不知道它是如何與WSGi同向的。如果你正在編程WSGI,我不確定是否推薦使用'os'模塊。 –

2

GAE無權訪問文件。如果您想提供文件,請從靜態目錄或blobstore提供。

2

運行AppEngine的用戶沒有對該目錄的讀取權限。嘗試修改BP目錄。

但即便如此,這將無法工作,一旦你部署你的應用程序。 App Engine中沒有文件系統的概念。我可以建議你將文件存儲在blob或數據存儲中。或靜態目錄。

+1

處理程序「有一個文件系統在App Engine上沒有概念」 - 這是完全不真實的。文件系統只是只讀的。 –

+1

你當然是對的。我打算說的是,你不能把東西放在你的系統上的一個隨機文件夾中,chmod它,並期望它在部署完成後工作。 –

+0

有趣的評論傢伙。什麼是文件? 「在UNIX中,一切都是文件」,我不同意這種說法。 –

0

也可以提供靜態文件,不需要爲這個

- url: /sampleData\.csv 
    static_files: sampleData.txt 
    upload: sampleData\.csv 
    http_headers: 
    Content-Type: text/csv 
    Content-Disposition: "attachment; filename=sample.csv"