在Google App Engine中上传文件

时间:2020-03-05 18:58:24  来源:igfitidea点击:

我打算创建一个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应用程序(带有头像)时,它可以完美运行。我在代码中完全按照相同的方式进行操作,但这只是行不通。我离拔头发很近。