Как установить Content-Type автоматически, когда я загружаю загруженные данные. - PullRequest
0 голосов
/ 17 июня 2010

Это мой код:

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db

#from login import htmlPrefix,get_current_user

class MyModel(db.Model):
   blob = db.BlobProperty()

class BaseRequestHandler(webapp.RequestHandler):
  def render_template(self, filename, template_args=None):
    if not template_args:
      template_args = {}
    path = os.path.join(os.path.dirname(__file__), 'templates', filename)
    self.response.out.write(template.render(path, template_args))

class upload(BaseRequestHandler):
  def get(self):
    self.render_template('index.html',)
  def post(self):
    file=self.request.get('file')
    obj = MyModel()
    obj.blob = db.Blob(file.encode('utf8'))
    obj.put()
    self.response.out.write('upload ok')
class download(BaseRequestHandler):
    def get(self):
        #id=self.request.get('id')
        o = MyModel.all().get()
        #self.response.out.write(''.join('%s: %s <br/>' % (a, getattr(o, a)) for a in dir(o)))
        self.response.out.write(o)


application = webapp.WSGIApplication(
    [
        ('/?', upload),
        ('/download',download),
    ],
    debug=True
)
def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()

Мой index.html:

<form action="/" method="post">
<input type="file" name="file" />
<input type="submit" />
</form>

И это показывает:

<__main__.MyModel object at 0x02506830>

Но я нехочу увидеть это, хочу скачать.

Как изменить мой код для запуска?

Спасибо

обновлено

Теперь все в порядке:

class upload(BaseRequestHandler):
  def get(self):
    self.render_template('index.html',)
  def post(self):
    file=self.request.get('file')
    obj = MyModel()
    obj.blob = db.Blob(file)
    obj.put()
    self.response.out.write('upload ok')
class download(BaseRequestHandler):
    def get(self):
        #id=self.request.get('id')
        o = MyModel.all().order('-').get()
        #self.response.out.write(''.join('%s: %s <br/>' % (a, getattr(o, a)) for a in dir(o)))
        self.response.headers['Content-Type'] = "image/png"
        self.response.out.write(o.blob)

И новый вопрос:

, если вы загрузите файл 'png', он будет отображаться успешно, но когда я загружу файл rar, я буду работатьошибка.Итак, как установить Content-Type автоматически и что такое Content-Type файла 'rar'?

Спасибо

Ответы [ 2 ]

1 голос
/ 17 июня 2010

См. блог Ника для рабочего примера.

В основном при загрузке вам нужно извлечь файл из self.request.POST вместо get, чтобы получить более полезный cgi.FieldStorage объект. Затем вы можете прочитать тип mime из file.type, сохранить строку типа в вашей сущности вместе с BLOB-объектом и записать его с заголовками ответов при загрузке.

Другой вариант - сохранить file.name в вашей сущности при загрузке, а затем подключить его к mimetypes.guess_type(), чтобы угадать тип на основе расширения файла при загрузке.

0 голосов
/ 17 июня 2010

Какие данные хранятся в вашем BLOB-объекте?Это изображение?Потому что вам нужно будет преобразовать его в изображение, прежде чем записывать его обратно в ответ.

Теперь вы пишете объект прямо в ответ, что приводит к печати строки с адресом и типом объекта.

[edit] Правильный тип содержимого для RARфайлы будут application/x-rar-compressed.И я не думаю, что вы можете автоматически определить тип контента из BLOB-объекта.Вам нужно будет вручную установить правильный тип контента для каждого типа файлов, который вы хотите, чтобы пользователи могли загружать.

...