如何在下载我上传的数据时自动设置Content-Type?

0 投票
2 回答
1130 浏览
提问于 2025-04-16 00:05

这是我的代码:

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是什么呢?

谢谢

2 个回答

0

你的blob里面存储的是什么数据?是图片吗?因为在把它写回响应之前,你需要先把它转换成图片格式。

你现在做的事情是直接把对象写入响应,这样会导致输出一个包含对象地址和类型的字符串。

[编辑] RAR文件的正确内容类型应该是 application/x-rar-compressed。而且我觉得你不能自动从blob中判断内容类型。你需要手动为每种用户可以下载的文件类型设置正确的内容类型。

1

可以去看一下Nick的博客,里面有个可以用的例子。

简单来说,当你上传文件时,需要从 self.request.POST 中获取文件,而不是用 get 方法,这样才能得到更有用的 cgi.FieldStorage 对象。然后你可以通过 file.type 来读取文件的类型,把这个类型的字符串和文件内容一起保存到你的数据实体中,并在下载时通过响应头把它写出来。

另一种方法是在上传时把 file.name 保存到你的数据实体中,然后在下载时用 mimetypes.guess_type() 根据文件的扩展名来猜测文件类型。

撰写回答