如何在Windows中使用Python BaseHttpRequestHandler将图像传输到客户端?

时间:2013-09-02 04:18:28

标签: python windows http python-imaging-library basehttprequesthandler

我知道之前已经提出过这个问题,例如:How do I serve image Content-types with Python BaseHTTPServerRequestHandler do_GET method?,但“将文件打开模式设置为二进制”的典型答案对我不起作用。

我正在使用Windows。所有对文本数据(html,js,css)的请求都没有任何问题。图像和字体请求不能正确满足。返回的响应总是包含大约150个字节(但实际上应该大约为50k)。所以,我认为基本上是空的回应,缺少图像和字体。到目前为止,我在Linux下使用相同的代码没有遇到任何问题:

content = open(content_path, 'rb')
...
self.send_response(200)
self.send_header('Content-type', 'image/jpeg')
self.end_headers()
self.wfile.write(content.read) 
content.close()  

我最初使用“打开”的默认模式,在阅读了类似问题的回复后,我添加了二进制标志,假设它可以解决问题,但事实并非如此。这里有一些编码问题吗?同样,这在Linux下也能正常工作。这是打印到控制台的“内容”的值:

<open file [my_file_path], mode 'rb' at 0x02A9BA18> with mime-type image/jpeg

如果它是相关的,我可能还应该提到,在应用程序早期之前,python PIL库已经调整了所有图像的大小。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:8)

您发送read方法的字符串表示形式。 而是通过附加read来调用()方法:

self.wfile.write(content.read()) 

如果文件很大,file.read()会产生问题,因为read()会将文件内容加载到内存中。为防止这种情况,请使用shutil.copyfileobj

import shutil

...

self.send_response(200)
self.send_header('Content-type', 'image/jpeg')
self.end_headers()
with open(content_path, 'rb') as content:
    shutil.copyfileobj(content, self.wfile)