1

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

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)用来保存它。它似乎对我有用。如果这是一个好方法,请分享您的想法。

4

1 回答 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 请求对象中提取。请注意,您不需要从 BlobStoreUploadHandler 继承,因为您没有使用 HTML 上传表单。

于 2011-05-03T12:55:47.877 回答