我有一个服务器端代码来处理上传的二进制文件:
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)
来保存它。它似乎对我有用。如果这是一个好方法,请分享你的想法。
答案 0 :(得分: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继承。