Python 如何使用Blobstore API接收上传的文件并将其存储

Python 如何使用Blobstore API接收上传的文件并将其存储,python,google-app-engine,blobstore,Python,Google App Engine,Blobstore,我有一个服务器端代码来处理上传的二进制文件: class UploadHandler(webapp.RequestHandler): def post(self): file_name = files.blobstore.create(mime_type='application/octet-stream') with files.open(file_name, 'a') as f: f.write('data')

我有一个服务器端代码来处理上传的二进制文件:

class UploadHandler(webapp.RequestHandler):
    def post(self):
        file_name = files.blobstore.create(mime_type='application/octet-stream')
        with files.open(file_name, 'a') as f:
            f.write('data')
        files.finalize(file_name)
        blob_key = files.blobstore.get_blob_key(file_name)
这是来自示例的代码,所以实际上它不处理任何上传的文件,只需创建一个新的Blobstore实体并向其中写入一些数据。从客户端,我得到了将文件实际发送到服务器的这部分代码:

    var xhr = new XMLHttpRequest();
    xhr.open("post", "/upload", true);

    xhr.setRequestHeader("Content-Type", "multipart/form-data");
    xhr.setRequestHeader("X-File-Name", file.fileName);
    xhr.setRequestHeader("X-File-Size", file.fileSize);
    xhr.setRequestHeader("X-File-Type", file.type);

    xhr.send(file);
在FireBug中,我看到它将文件上传到服务器,服务器代码创建了一个应该是的文件。我搞不清楚的是如何连接这两个部分,以便服务器端代码能够以流的形式接收上传的文件。我不使用表单,因此无法使用类似于
upload\u files=self.get\u uploads('file')
的内容获取文件。如何在服务器端检索文件


更新:我在GAE文档中找到了关于webapp请求处理程序的答案。我需要像这样使用
uploaded\u file=self.request.body
来获取文件流。然后我就用
f.write(上传的文件)
来保存它。这似乎对我有用。如果这是一个好方法,请分享您的想法。

应该是这样的:

class UploadHandler(webapp.RequestHandler):
    def post(self):
        mime_type = self.request.headers['X-File-Type']
        name = self.request.headers['X-File-Name']
        file_name = files.blobstore.create(mime_type=mime_type,
                                           _blobinfo_uploaded_filename=name)
        with files.open(file_name, 'a') as f:
            f.write(self.request.body)
        files.finalize(file_name)
        blob_key = files.blobstore.get_blob_key(file_name)

可以从对象中提取自定义标题和正文。请注意,您不需要从BlobStoreUploadHandler继承,因为您没有使用HTML上载表单。

应该是这样的:

class UploadHandler(webapp.RequestHandler):
    def post(self):
        mime_type = self.request.headers['X-File-Type']
        name = self.request.headers['X-File-Name']
        file_name = files.blobstore.create(mime_type=mime_type,
                                           _blobinfo_uploaded_filename=name)
        with files.open(file_name, 'a') as f:
            f.write(self.request.body)
        files.finalize(file_name)
        blob_key = files.blobstore.get_blob_key(file_name)

可以从对象中提取自定义标题和正文。请注意,您不需要从BlobStoreUploadHandler继承,因为您没有使用HTML上载表单。

这仅在文件小于10MB时有效。否则,您应该发送一个正确编码的多部分表单,并使用常规blobstore上载方法。这仅在文件小于10MB时有效。否则,应发送正确编码的多部分表单,并使用常规blobstore上载方法。