0

在Google App Engine的常規(非靈活)實例上,您可以使用Blobstore API並創建一個URL以允許用戶將文件直接上傳到Blobstore中。上傳時,應用程序引擎應用程序會收到文件位置的通知,並可以對其進行處理。 python代碼的一個示例是:Google Cloud Storage create_upload_url - App Engine靈活的Python

from google.appengine.ext import blobstore 
upload_url = blobstore.create_upload_url('/upload_photo') 

請參閱the Blobstore docs

切換到Google App Engine靈活環境,usage of the Blobstore has been largely replaced by Cloud Storage。在這種情況下,是否有相當於create_upload_url

我當前的實現需要將標準文件上傳到python Flask應用程序。

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob(blob_name) 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 

這似乎是它與create_upload_url相比增加一倍的網絡負荷,因爲該文件即將進入我的應用程序引擎實例,然後被複製出來:那麼喜歡的東西進行。因此,上傳者會在發生這種情況時等待額外的時間。據推測,我也會爲此收取額外的App Engine費用。有沒有更好的辦法?

我有工作人員,後來處理上傳的文件,但我傾向於從他們的代碼中再次下載文件從雲存儲,因爲我不認爲你可以假設工作人員仍然可以訪問存儲在實例文件系統。因此,我沒有將文件上傳到我的實例而不是直接指向它的存儲位置。

+0

幾天前我回答了一個類似的問題https://stackoverflow.com/questions/42002013/replacing-blobstore-upload-handler-with-gcs/42002289#42002289它可以幫助你。您可以使用創建上傳處理程序的相同方法。 – Aaron

+0

謝謝@Samson,但我不認爲'google.appengine.ext.blobstore'包在App Engine靈活環境中可用。也許我錯了? –

+0

@JonG你找到了答案嗎? –

回答

0

我已經開始使用create_resumable_upload_session創建我們的客戶端應用程序可以上傳文件的簽名URL。喜歡的東西:

gcs = storage.Client() 
bucket = gcs.get_bucket(BUCKET) 
blob = bucket.blob(blob_name) 
signed_url = blob.create_resumable_upload_session(content_type=content_type) 

然後當客戶端已成功地將文件上傳到我們的存儲,我訂閱使用此Cloud Pub/Sub Notifications for Cloud Storage創建的發佈/訂閱通知。

0

與新的谷歌雲存儲客戶端創建的每個斑點具有public_url屬性:

from flask import request 
from google.cloud import storage 

uploaded_file = request.files.get('file') 

gcs = storage.Client() 
bucket = gcs.get_bucket(bucket_name) 
blob = bucket.blob('blob_name') 
blob.upload_from_string(
    uploaded_file.read(), 
    content_type=uploaded_file.content_type 
) 
url = blob.public_url 

-

隨着Blob存儲區,在您的實例的GAE系統處理器負責上傳文件的你傳遞給創建的上傳url。我不確定這是否是在代碼中處理它自己的問題。如果您當前的方法存在問題,則可能需要考慮執行上傳客戶端,而不是通過App Engine傳遞文件。 GCS有一個REST API,雲存儲客戶端在下面使用它,所以如果更方便,您可以直接讀取並上傳文件到客戶端的GCS。您可通過firebase.google.com/docs/storage/web/upload-files輕鬆完成整個過程

+0

感謝您的幫助。您的解決方案仍然要求將整個文件發送到我的應用引擎實例,然後轉發到Google雲端存儲,在進出的方式上產生費用,對嗎?使用create_upload_url,用戶直接上傳到Blobstore,因此我只會爲該上傳收取費用。那有意義嗎? –

+0

嗯,使用Blobstore,實例中的GAE系統處理程序會處理您傳遞給創建的上傳url的上傳文件。我不確定這是否是在代碼中處理它自己的問題。如果你目前的方法有問題,你可能要考慮做上傳客戶端。 GCS有一個REST API,雲存儲客戶端在下面使用它,所以如果更方便,您可以直接讀取並上傳文件到客戶端的GCS。有https://firebase.google.com/docs/storage/web/upload-files可讓您輕鬆完成整個過程 –

相關問題