Python 尝试在http响应中发送文件时出错:[Errno 10053]

Python 尝试在http响应中发送文件时出错:[Errno 10053],python,http,basehttpserver,Python,Http,Basehttpserver,我试图通过在Python中写入BaseHTTPRequestHandler的wfile变量,在http响应中发送一个大文件,当我试图这样做时,我总是以Python代码中的以下异常结束 错误:[Errno 10053]计算机中的软件中止了已建立的连接 谁能帮我解决这个问题??为什么我会出错? 如果我在HTTP响应中发送大文件的方式不好,请建议我可以参考的地方 提前感谢 import os import urlparse import BaseHTTPServer from SocketServer

我试图通过在Python中写入BaseHTTPRequestHandler的wfile变量,在http响应中发送一个大文件,当我试图这样做时,我总是以Python代码中的以下异常结束

错误:[Errno 10053]计算机中的软件中止了已建立的连接

谁能帮我解决这个问题??为什么我会出错? 如果我在HTTP响应中发送大文件的方式不好,请建议我可以参考的地方

提前感谢

import os
import urlparse
import BaseHTTPServer
from SocketServer import ThreadingMixIn
import urlparse

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
    def handle(self):
        BaseHTTPServer.BaseHTTPRequestHandler.handle(self)

    def sendError(self, errorCode, errorMessage):
        self.send_response(errorCode, errorMessage)
        self.send_header("Content-type", "text/plain")
        self.send_header("Content-Length", str(len(errorMessage)))
        self.end_headers()
        self.wfile.write(errorMessage)

    def do_GET(self):
        scm, netloc, path, params, query, fragment = urlparse.urlparse(self.path, 'http')
        if path.find(".ld") > 0:
            filename = path.rpartition("/")[2]
            try:
                with open(filename, 'rb') as f:
                    self.send_response(200, "Ok")
                    self.send_header("Content-type","application/octet-stream")
                    total_size = os.path.getsize(filename)
                    self.send_header("Content-Length", total_size)
                    self.end_headers()
                    self.wfile.write(f.read())
            except IOError:
                self.sendError(404, "Not Found")

class ThreadedHTTPServer(ThreadingMixIn, BaseHTTPServer.HTTPServer):
    def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
        BaseHTTPServer.HTTPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate)

def main():
    Handler.close_connection = 0
    Handler.protocol_version = 'HTTP/1.1'
    global httpd
    httpd = ThreadedHTTPServer(("", 8900), Handler)
    httpd.daemon_threads = True
    httpd.serve_forever()

if __name__ == "__main__":
    main()
错误跟踪:

Exception happened during processing of request from ('172.24.128.21', 19418)
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 593, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\SocketServer.py", line 649, in __init__
    self.handle()
  File "simple.py", line 10, in handle
    BaseHTTPServer.BaseHTTPRequestHandler.handle(self)
  File "C:\Python27\lib\BaseHTTPServer.py", line 342, in handle
    self.handle_one_request()
  File "C:\Python27\lib\BaseHTTPServer.py", line 310, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "C:\Python27\lib\socket.py", line 476, in readline
    data = self._sock.recv(self._rbufsize)
error: [Errno 10054] An existing connection was forcibly closed by the remote ho
st

好的,所以我在清理了一点后尝试了你的代码:

    def do_GET(self):
        _, _, path, _, _, _ = urlparse.urlparse(self.path, 'http')
        if path.find(".ld") > 0:
            filename = path.rpartition("/")[2]
            try:
                with open(filename, 'rb') as f:
                    self.send_response(200, "Ok")
                    self.send_header("Content-type", self.headers.getheader("Content-type", ""))
                    total_size = os.path.getsize(filename)
                    self.send_header("Content-Length", total_size)
                    self.end_headers()
                    self.wfile.write(f.read())
            except IOError:
                self.sendError(404, "Not Found")
我把一个foo.pl文件放在同一个文件夹中;然后,在做卷曲的时候http://localhost/foo.pl,我得到了一个关于文件内容的很好的响应,并且没有任何错误

我还必须说,看起来您只是在尝试使用path.rpartition/[2]获取文件名,而不使用路径部分,但为此,您应该只使用os.path.basename:

此外,path.find.ld>0可能应该改为path.endswith.ld

编辑:要高效支持大型文件,请执行以下操作:

CHUNK_SIZE = 1024 * 100  # 100kB chunks
while True:
    chunk = f.read(CHUNK_SIZE)
    if not chunk:
        break
    self.wfile.write(chunk)

如果您真的提供了一段可运行的代码,我会很高兴。。。这并不是说你应该粘贴整个代码,而是一个简化/简化的代码版本,任何人都可以将粘贴复制到一个.py文件中并运行,以帮助诊断你的问题;请看,我已经添加了我的可运行代码段。你能帮我解决这个问题吗。。我试图传输的文件是.LD文件,大小为60000kb。请粘贴复制问题所需的部分代码,而不是整个项目;看见此外,您可以只修改现有的代码片段,而不必继续在文章中添加内容。这是重现问题的简单代码,可能有些导入模块可能没有用。方法do_GET中的代码片段导致了问题,因此请删除与问题无关的所有内容,包括无用的导入。感谢您的建议,我将更改这些内容。在那里我可以添加我的错误跟踪。。在最初的帖子中?当我尝试用我的代码下载一个小文件时,它会起作用。。问题只在于大文件。当我尝试下载大小为60的.ld文件类型时,我遇到了一个异常,000kb@user2153447:我修改了答案以解释如何处理大文件,例如60MB。:谢谢!!我已经试过了。我能够成功地传输文件,但也得到了相同的异常。是不是可以忽略不计?@DineshKumar:所以我的更改帮助文件传输本身工作,但在成功/完整下载文件后,例外情况仍然存在?
CHUNK_SIZE = 1024 * 100  # 100kB chunks
while True:
    chunk = f.read(CHUNK_SIZE)
    if not chunk:
        break
    self.wfile.write(chunk)