Получать (обслуживать) файлы из хранилища больших двоичных объектов в GAE

Я работал над небольшим проектом; основные функции этого проекта следующие:

1-Загрузка файлов с ПК пользователя (с использованием загрузки файлов в формате HTML (отправка форм))

2-Сожмите эти загруженные файлы в один zip-архив.

3. Сохраните этот Zip-файл в GAE BlobStore.

4-Получите (обслужите) этот zip-архив из blobstore в ПК (загрузите этот zip-архив, чтобы он был доступен локально).

Шаги 1, 2 и 3 были выполнены правильно, но проблема на шаге 4: я не могу загрузить этот Zip из blobstore; Это код, который я использовал:

from __future__ import with_statement
from google.appengine.api import files
import cgi, cgitb ; cgitb.enable()
import StringIO
import zipfile
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp.util import run_wsgi_app
glob_blob_info="" 
class zip():
    def z(self):
        form = cgi.FieldStorage()
        zipstream=StringIO.StringIO()
        zfile = zipfile.ZipFile(file=zipstream,mode="w",compression=zipfile.ZIP_DEFLATED)
        file_upload = form['file[]']
        filename2 = file_upload.filename
        data=file_upload.file.read()
        zfile.writestr(filename2,data)
        zfile.close()
        zipstream.seek(0)
        zip_file = files.blobstore.create(mime_type='application/zip',_blobinfo_uploaded_filename='test.zip')
        with files.open(zip_file, 'a') as f:
            f.write(zipstream.getvalue())
        files.finalize(zip_file)
        blob_key = files.blobstore.get_blob_key(zip_file)
        print blob_key
        blob_info = blobstore.BlobInfo.get(blob_key)
        print blob_info
        global glob_blob_info
        glob_blob_info=blob_info
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self):
    print "doaa"
    global glob_blob_info 
    glob_blob_info = urllib.unquote(glob_blob_info)
    blob_info = blobstore.BlobInfo.get(glob_blob_info)
    self.send_blob(glob_blob_info,save_as=True)



def main():
    application = webapp.WSGIApplication( [('/serve', ServeHandler),], debug=True)
    debug=True)
    c=zip()
    c.z()
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Теперь class zip() выполняется успешно, так что zip-архив, содержащий файлы, загруженные пользователем, был успешно создан в GAE Blobstore, но проблема именно в том, что class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): не выполнялся, когда я запускал этот код, у меня есть следующий результат:

Status: 404 Not Found 
Content-Type: text/html;
charset=utf-8 Cache-Control: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Content-Length: 0

Есть идеи по решению этой проблемы? Заранее благодарим.


person Computer_Engineer    schedule 26.03.2012    source источник
comment
Пожалуйста, перестаньте публиковать почти одинаковые вопросы.   -  person Nick Johnson    schedule 27.03.2012
comment
возможный дубликат Send_blob в GAE   -  person Nick Johnson    schedule 27.03.2012
comment
@ Ник Джонсон: Извините за это, но проблема все еще существует !!!   -  person Computer_Engineer    schedule 27.03.2012
comment
@Eng_Engineer: гораздо лучше отредактировать свой первый вопрос, чем открывать второй вопрос, который почти идентичен (даже если проблема все еще существует).   -  person Stefan    schedule 28.03.2012
comment
@Stefan: Да, это правильно, извините за это, вы понимаете мой вопрос в этом посте ??   -  person Computer_Engineer    schedule 28.03.2012
comment
@Eng_Engineer, извините, у меня нет ответа.   -  person Stefan    schedule 28.03.2012
comment
@Stefan: Хорошо, спасибо, я попробую.   -  person Computer_Engineer    schedule 28.03.2012


Ответы (2)


Какая часть обслуживания большого двоичного объекта описана здесь, не работает для тебя?

person Stuart Langley    schedule 26.03.2012
comment
: Этот класс не выполняется (класс ServeHandler), и это моя проблема ?? - person Computer_Engineer; 27.03.2012
comment
: само приложение в main () не выполняется. - person Computer_Engineer; 27.03.2012

Я знаю, что это может быть очевидно, но настроен ли ваш app.yaml для обработки этого пути приложения? Это даст вам 404. И почему вы здесь используете глобальный? Я бы этого не допустил. Передайте ему безопасный URL-адрес большого двоичного объекта как часть URL-адреса или в параметре URL-адреса и получите от него информацию о большом двоичном объекте. Если вы используете global с appengine, у вас могут возникнуть всевозможные потенциальные проблемы.

Я использовал хранилище BLOB-объектов для создания всевозможных файлов, подобных вещам, и никогда не имел проблем. Скорее всего, это проблема с вашим кодом / приложением, чем с send_blob.

person Justin Grayston    schedule 28.03.2012
comment
: я пробовал этот подход, чтобы передать blobinfo через URL-адрес, но проблема заключалась в том, что я не могу получить этот ключ (информацию) из URL-адреса в классе ServerHandler? - person Computer_Engineer; 28.03.2012