2011-05-03 52 views
1

我有一个服务器端的代码来处理上传的二进制文件:如何接收上传文件来存储它使用Blob存储区API

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_files = self.get_uploads('file')这样的文件。如何在服务器端检索文件?

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

回答

1

应该是这样的:

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) 

您的自定义标题和正文可以从WebOb Request对象拉。请注意,由于您未使用HTML上传表单,因此您无需继承BlobStoreUploadHandler。

+0

绝对正确!谢谢。 – 2011-05-03 13:00:06

+2

这只有在文件小于10MB时才有效。否则,您应该发送正确编码的多部分表单并使用常规的Blobstore上传方法。 – 2011-05-03 16:13:49

相关问题