使用Python在GAE Appengine中显示上传的文件

时间:2013-12-04 13:21:02

标签: python google-app-engine pdf google-cloud-datastore

我已将用户上传的pdf文件存储在数据存储区中,如BlobProperties:

<form action="/" method="post" enctype="multipart/form-data">
    <input type="file" name="pdf">
    <input type="submit" value="Upload">
</form>

使用以下处理程序:

def post(self):
    p = self.request.get('pdf')
    if p:
        person.pdf = p

我也尝试了最后一行的这个版本:

        person.pdf = db.Blob(p)

似乎以同样的方式工作。我试着这样显示它:

<embed src="{{ person.pdf }}" width="500"
    height="375" type="application/pdf">

使用此处理程序:

def get(self,person_id):
  person = Person.get_by_id(int(person_id))

  self.response.headers['Content-Type']="application/pdf"

  template_values = {
      'person' : person
      }

  template = jinja_environment.get_template('person.html')
  self.response.out.write(template.render(template_values))

person.pdf的大小表明它确实包含整个pdf内容,但在模板中,变量

{{ person.pdf }}

导致以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 10: ordinal not in range(128)

所以没有显示任何内容。据我所知,Blobproperties存储为字符串。我错过了什么?

3 个答案:

答案 0 :(得分:0)

代码尝试使用ASCII编解码器将您的字符串转换为unicode。 您上传了一个真实的pdf,内容不是ASCII。如果pdf中的某个地方有一个字符",你也可能会破坏你的页面。

查看对内容进行编码。 Base64运行得相当好,但还有其他的。 至少你应该逃避那里的数据。

答案 1 :(得分:0)

这似乎是错误的最基本的方式是:

<embed src="{{ person.pdf }}">

应包含下载pdf文件的URL。但是,person.pdf实际上包含文件数据。

你需要一个处理程序来为html提供pdf数据的URL,以及一个单独的处理程序来返回pdf数据。

答案 2 :(得分:0)

我终于解决了这个问题:

self.response.write(person.pdf)

在显示处理程序中。 D'哦。