簡體   English   中英

從appengine app將文件上傳到Google雲端存儲

[英]Upload files to Google cloud storage from appengine app

我確信這個問題的答案很簡單,但對我來說,事實證明這是非常令人沮喪的,因為我無法將任何我發現的解決方案放到我自己使用的實用代碼中。

我正在應用引擎上構建一個應用程序,讓用戶上傳一個文件,然后由應用程序執行操作。 文件的大小通常約為幾Mbs,在某些情況下可能高達20 Mb左右。 這足以觸發應用程序引擎中的30秒超時,因此我嘗試按照各種網站(包括此處)的建議直接上傳到雲存儲。

我的表單的上傳部分如下所示:

<form name="convert" action="/transform" method="post" enctype="multipart/form-data">
    <input type="file" name="coords">
    <input type="submit" name="submit" value="Transform">
</form>

處理程序看起來像這樣(我只是開始使用app引擎,所以如果這看起來很愚蠢,請道歉。

class TransformPage(BaseHandler):
    def get(self):
    self.render_template('transform.html',name=self.request.get('form'))

    def post(self):     
        filename = self.request.POST['coords'].filename
        filesize = int(self.request.headers['Content_Length'])

        if filesize>5242880:
            self.redirect('/error')
        else:
             save_to_cloud(file.value,filename)
             # Start processing file here

我把檢查文件大小作為防止30秒超時的一種非常簡單的方法,5Mb似乎是我在網絡上30秒內可以推進的最大大小。

save_to_cloud()只是我圍繞Google雲端存儲API編寫的包裝器,如下所示:

def save_to_cloud(f,filename):
    filename = BUCKET + filename                                                          
    create_file_and_write(f,filename)

以上所有工作,我看到上傳的文件最終在雲存儲,但正如我上面所說,分解更大的文件。 我已經看到了關於使用create_upload_url搜索的提示,但是我不太了解這與我的情況有什么關系,特別是將上傳文件的內容讀入內存以便我可以將其寫入雲存儲。

如果你知道它是如何完成的,這可能是世界上最簡單的事情,但如果沒有人在代碼中向我展示它是如何完成的,我就無法做到:-(

謝謝

編輯:@Itamar:這確實是我想要完成的,盡管上傳表單還包含一些其他用戶選擇。 我現在已將代碼更改為此

class TransformPage(BaseHandler):
    def get(self):
        upload_url =blobstore.create_upload_url('/upload',gs_bucket_name='/my_bucket/')


        self.render_template('transform.html',
                            {'name':self.request.get('form'),                 
                            {'upload_url':upload_url})

但我無法讓upload_url顯示在模板html中,看起來像這樣

<form name="convert" action="{{ upload_url }}" method="post" enctype="multipart/form-data">

如果我理解正確,您要做的是從App Engine提供一個表單,允許用戶選擇要上傳的文件。 由於上傳的文件可能較大,因此您不希望在App Engine中處理上傳,而是將文件直接上傳到Google雲端存儲。

這可以做到,而且並不太難。 實際上,這正是App Engine Python Blobstore文檔中給出的示例。 可能令人困惑的是,當您希望雲存儲中的文件時,該示例引用Blobstore - 但它沒關系 - 從1.7.0版開始,您可以執行以下操作:

upload_url = blobstore.create_upload_url('/upload', gs_bucket_name='my_bucket')

(而不是我鏈接的示例中的第1步),上傳網址將直接上傳到雲端存儲。

現在,您的表單操作應該是blobstore.create_upload_url函數返回的字符串upload_url

表單完成處理(意味着文件已上載)后,它將重定向到您傳遞給該函數的參數(在示例中為/upload )。

您不需要編寫自己的POST處理函數,如問題中所述。

我已經創建了一個關於如何上傳和使用GCS文件的要點: https//gist.github.com/voscausa/9541133

這是處理多部分表單帖子的代碼:

class GcsUpload(webapp2.RequestHandler):

    def post(self):

        field_storage = self.request.POST.get("file", None)
        if isinstance(field_storage, cgi.FieldStorage):
            file_name = field_storage.filename

            dyn = gcs_data.Dynamics(id=file_name, filename=file_name)
            gcs_file_name = gcs_data.gcs_write_blob(dyn, field_storage.file.read())
            gcs_data.gcs_serving_url(dyn)
            dyn.put()
            logging.info('Uploaded and saved in default GCS bucket : ' + gcs_file_name)

            self.response.headers[b'Content-Type'] = gcs_data.gcs_content_type(dyn)
            self.response.write(gcs_data.gcs_read_blob(dyn))

        else:
            logging.error('GCS Upload failed')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM