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

1 投票
1 回答
1157 浏览
提问于 2025-04-16 16:53

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

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 继承。

撰写回答