【问题标题】:How to set Content-Type automatically when i download the data that i uploaded.下载上传的数据时如何自动设置 Content-Type。
【发布时间】:2023-03-04 21:49:01
【问题描述】:

这是我的代码:

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 以及 'rar' 文件的 Content-Type 是什么?

谢谢

【问题讨论】:

    标签: python google-app-engine upload download content-type


    【解决方案1】:

    什么样的数据存储在您的 Blob 中?是图像吗?因为您需要先将其转换为图像,然后再将其写回响应中。

    您现在所做的是将对象直接写入响应,这会导致它打印一个包含对象地址和类型的字符串。

    [编辑] RAR 文件的正确内容类型是application/x-rar-compressed。而且我认为您不能自动从 blob 中确定内容类型。您必须为希望用户能够下载的每种文件类型手动设置正确的内容类型。

    【讨论】:

      【解决方案2】:

      有关工作示例,请参阅 Nick's blog

      基本上在上传时,您需要从self.request.POST 而不是get 拉取文件,以便获得更有用的cgi.FieldStorage 对象。然后,您可以从 file.type 读取 mime 类型,将类型字符串与 blob 一起保存到您的实体中,并在下载时将其与响应标头一起写出来。

      另一种选择是在上传时将file.name 保存到您的实体,然后将其插入mimetypes.guess_type() 以在下载时根据文件扩展名猜测类型。

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 2015-07-22
        • 2019-12-15
        • 2017-10-04
        • 2010-12-08
        • 2021-06-13
        • 1970-01-01
        相关资源
        最近更新 更多