2013-08-22 3 views
0

Я использую флэш-фреймворк на GAE/Python. После загрузки файла в Cloud Storage я хочу получить ссылку на файл, чтобы его можно было обслуживать. Я не могу заставить parse_file_info работать. Я искал долго и упорно и провел в течение двух дней, пытаясь сделать эту работу. Я в конце своего ума! Вы можете увидеть мои обработчики ниже:GAE + облачное хранилище - невозможно загрузить FileInfo после загрузки файла

@app.route('/upload_form', methods = ['GET']) 
def upload_form(): 
    blobupload_url = blobstore.create_upload_url('/upload', gs_bucket_name = 'mystorage')   
    return render_template('upload_form.html', blobupload_url = blobupload_url)  

@app.route('/upload', methods = ['POST']) 
def blobupload():  
    file_info = blobstore.parse_file_info(cgi.FieldStorage()['file']) 
    return file_info.gs_object_name 

ответ

1

Данные кодируются в полезной нагрузке uploaded_file извлекаются после загрузки блоб. Это пример кода о том, как извлечь имя:

import email 
from google.appengine.api.blobstore import blobstore 

def extract_cloud_storage_meta_data(file_storage): 
    """ Exctract the cloud storage meta data from a file. """ 
    uploaded_headers = _format_email_headers(file_storage.read()) 
    storage_object_url = uploaded_headers.get(blobstore.CLOUD_STORAGE_OBJECT_HEADER, None) 
    return tuple(_split_storage_url(storage_object_url)) 

def _format_email_headers(raw_headers): 
    """ Returns an email message containing the headers from the raw_headers. """ 
    message = email.message.Message() 
    message.set_payload(raw_headers) 
    payload = message.get_payload(decode=True) 
    return email.message_from_string(payload) 

def _split_storage_url(storage_object_url): 
    """ Returns a list containing the bucket id and the object id. """ 
    return storage_object_url.split("/")[2:4] 

@app.route('/upload', methods = ['POST']) 
def blobupload():  
    uploaded_file = request.files['file'] 
    storage_meta_data = extract_cloud_storage_meta_data(uploaded_file) 
    bucket_name, object_name = storage_meta_data 
    return object_name 
+1

Эй, спасибо большое за это! но почему вы не можете использовать [fileInfo Class] (https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass?hl=ru)? – jess

+0

parse_file_info анализирует данные cgi.FieldStorage. Flask предоставляет только FileStorage, и легче было получить информацию вместо создания FieldStorage со всеми необходимыми атрибутами. –

Смежные вопросы