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

用Python在GAE Appengine中显示上载的文件,python,google-app-engine,pdf,google-cloud-datastore,Python,Google App Engine,Pdf,Google Cloud Datastore,我已将用户上传的pdf文件存储在数据存储中,作为BlobProperty: <form action="/" method="post" enctype="multipart/form-data"> <input type="file" name="pdf"> <input type="submit" value="Upload"> </form> 我还尝试了最后一行的这个版本: person.pdf = db.B

我已将用户上传的pdf文件存储在数据存储中,作为BlobProperty:

<form action="/" method="post" enctype="multipart/form-data">
    <input type="file" name="pdf">
    <input type="submit" value="Upload">
</form>
我还尝试了最后一行的这个版本:

        person.pdf = db.Blob(p)
这似乎也是同样的道理。我试着这样展示它:

<embed src="{{ person.pdf }}" width="500"
    height="375" type="application/pdf">
person.pdf的大小表明它确实包含整个pdf内容,但在模板中,变量

{{ person.pdf }}
导致以下错误:

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

因此没有显示任何内容。据我所知,BlobProperty存储为字符串。我遗漏了什么?

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

看看对内容的编码。Base64工作得相当好,但还有其他一些。
至少你应该转义那里的数据。

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

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

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


您需要一个处理程序来为html提供指向pdf数据的URL,还需要一个单独的处理程序来返回pdf数据。

我最终通过简单的操作解决了这个问题:

self.response.write(person.pdf)

在display handler.D'oh.

中,我不太清楚如何以及在何处对base64进行编码和解码。我尝试使用此命令:
,但这导致了相同的错误。很抱歉,此注释中的格式错误-enter没有给我换行符。
<embed src="{{ person.pdf }}">
self.response.write(person.pdf)