如何使用Blobstore 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 个回答
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 请求 对象中获取你自定义的头信息和内容。注意,因为你没有使用 HTML 上传表单,所以不需要从 BlobStoreUploadHandler 继承。