1

我正在研究 Django、python 和应用程序引擎,谁能告诉我使用 urllib2 将 pdf 文件发送到 url,(文件是 InMemoryUploadedFile)。我知道 SOF 中存在一个问题,即使用 urllib2 发送数据,数据为 JSON 格式。但在这里我想发送一个 InMemoryUploadedFile,它是从 html 页面上传的 pdf 文件。提前致谢...

4

1 回答 1

1

您可能想查看Python:HTTP Post a large file with streaming

您将需要使用mmap在内存中流式传输文件,然后将其request设置为 并将标头设置为适当的 mime 类型,即application/pdf在打开 url 之前。

import urllib2
import mmap

# Open the file as a memory mapped string. Looks like a string, but 
# actually accesses the file behind the scenes. 
f = open('somelargefile.pdf','rb')
mmapped_file_as_string = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)

# Do the request
request = urllib2.Request(url, mmapped_file_as_string)
request.add_header("Content-Type", "application/pdf")
response = urllib2.urlopen(request)

#close everything
mmapped_file_as_string.close()
f.close()

由于 Google 应用引擎没有 mmap,您可能需要request.FILES暂时将文件写入磁盘

#f is the file from request.FILES
def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

然后使用标准文件操作直接从那里读取文件。

另一种选择是使用StringIO将文件作为字符串写入内存,然后将其传递给urlib2.request. 与使用流相比,这在多用户环境中可能效率低下。

于 2012-10-26T08:54:44.593 回答