在Google App Engine中上传文件
我打算创建一个Web应用程序,允许用户降级Visual Studio项目文件。但是,似乎Google App Engine通过db.TextProperty和db.BlobProperty接受文件上传和平面文件存储在Google服务器上。
我很高兴任何人都可以提供有关如何完成此工作的代码示例(客户端和服务器端)。
解决方案
回答
我们无法存储文件,因为没有传统的文件系统。我们只能将它们存储在自己的DataStore中(在定义为BlobProperty的字段中)
上一个链接中有一个示例:
class MyModel(db.Model): blob = db.BlobProperty() obj = MyModel() obj.blob = db.Blob( file_contents )
回答
Google App Engine中没有存储平面文件。一切都必须进入数据存储,这有点像关系数据库,但不完全是。
我们可以将文件存储为TextProperty或者BlobProperty属性。
DataStore条目的限制为1MB,这可能会或者可能不会造成问题。
回答
Google网上论坛对此有一个话题:
上载档案
有了很多有用的代码,该讨论对我上载文件有很大帮助。
回答
实际上,该问题在App Egnine文档中得到了回答。请参阅有关上传用户图像的示例。
<form> </ form>中的HTML代码:
<input type="file" name="img"/>
Python代码:
class Guestbook(webapp.RequestHandler): def post(self): greeting = Greeting() if users.get_current_user(): greeting.author = users.get_current_user() greeting.content = self.request.get("content") avatar = self.request.get("img") greeting.avatar = db.Blob(avatar) greeting.put() self.redirect('/')
回答
如果仍然有问题,请检查我们是否在表单标签中使用enctype
不:
<form encoding="multipart/form-data" action="/upload">
是的:
<form enctype="multipart/form-data" action="/upload">
回答
我个人发现,此处所述的教程在将GAE与Java运行时结合使用时非常有用。由于某些原因,当我尝试使用
<form action="/testservelet" method="get" enctype="multipart/form-data"> <div> Myfile:<input type="file" name="file" size="50"/> </div> <div> <input type="submit" value="Upload file"> </div> </form>
我发现我的HttpServlet类由于某种原因不接受带有'enctype'属性的表单。删除它是可行的,但是,这意味着我无法上传任何文件。
回答
Google发布了一项用于存储大文件的服务。看看blobstore API文档。如果文件> 1MB,则应使用它。
回答
我今天尝试,它的工作方式如下:
我的SDK版本是1.3.x
html页面:
<form enctype="multipart/form-data" action="/upload" method="post" > <input type="file" name="myfile" /> <input type="submit" /> </form>
服务器代码:
file_contents = self.request.POST.get('myfile').file.read()
回答
在App Engine上上传文件时,我观察到一些奇怪的行为。当我们提交以下表格时:
<form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="img" /> ... </form>
然后像这样从请求中提取img
:
img_contents = self.request.get('img')
img_contents
变量在Google Chrome中是str()
,但在Firefox中是unicode。如我们现在所述,db.Blob()
构造函数采用一个字符串,如果我们传入一个unicode字符串,将抛出错误。
有谁知道该如何解决?
另外,我发现绝对奇怪的是,当我复制并粘贴Guestbook应用程序(带有头像)时,它可以完美运行。我在代码中完全按照相同的方式进行操作,但这只是行不通。我离拔头发很近。