使用表单使用静态URL将文件上传到Google App Engine

时间:2015-07-30 14:13:27

标签: google-app-engine blobstore

我正在使用CrashRpt C ++从我编写的一个软件上传崩溃报告。 Crashrpt将崩溃报告中的数据上传到程序加载时设置的URL,与浏览器使用Web表单的方式相同。

CrashRpt发送类似HTML的数据

<html>
<form action="THE_WEBSITE" method="POST" enctype="multipart/form-data">
Application name:<input type="text" name="appname">
Application version:<input type="text" name="appversion">
Email from:<input type="text" name="emailfrom">
Email subject:<input type="text" name="emailsubject">
Crash GUID:<input type="text" name="crashguid">
MD5:<input type="text" name="md5">
Attach ZIP file:<input type="file" name="crashrpt">
<input type="submit" name="Submit">
</form>
</html> 

我们唯一的网络服务是Google App Engine。我们有什么办法可以使用表单将文件上传到静态地址而不是需要动态地址的blobstore。

我假设没有。

1 个答案:

答案 0 :(得分:1)

这是一个简单,自包含的示例,说明如何使用GAE上传(小 - 小于1 MB!)文件到静态网址(在此示例中,仅使用文本文件,因为这是我显示它们的方式):

import webapp2

from google.appengine.api import users
from google.appengine.ext import ndb

class UserFile(ndb.Model):
  filename = ndb.StringProperty()
  filedata = ndb.BlobProperty()


class UploadFormHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write('<html><body>')
        self.response.out.write('<form action="/upload_file" method="POST" enctype="multipart/form-data">')
        self.response.out.write(
        '''Upload File: <input type="file" name="file"><br>
        <input type="submit" name="submit" value="Submit">
        </form></body></html>''')


class UploadHandler(webapp2.RequestHandler):
    def post(self):
        thefile = self.request.POST.get('file')

        filename = thefile.filename
        userfile = UserFile(
          id=filename, filename=filename,
          filedata=thefile.value)
        userfile.put()

        self.redirect('/view_file/%s' % filename)


class ViewHandler(webapp2.RequestHandler):
    def get(self, fileid):
        k = ndb.Key(UserFile, fileid)
        userfile = k.get()

        self.response.headers['Content-Type'] = 'text/plain'
        self.response.write(userfile.filedata)


app = webapp2.WSGIApplication([('/', UploadFormHandler),
                               ('/upload_file', UploadHandler),
                               ('/view_file/([^/]+)?', ViewHandler),
                              ], debug=True)