Python 套接字 - 下载文件只能在 chrome 中使用



所以我创建了一个代码,客户端将文件上传到服务器文件夹,他可以选择将其下载回去,它在chrome中工作得很好,我单击要下载的项目,它会下载它

def send_image(request, cs):
request = request.split('=')
try:
name = request[1]
except:
name = request[0]
print('using send_iamge!')
print('Na ' + name)
path = 'C:\Users\x\Desktop\webroot\uploads' + '\file-name=' + name
print(path)
with open(path, 'rb') as re:
print('exist!')
read = re.read()
cs.send(read)

上面的代码读取您选择的文件,并将数据以字节形式发送回客户端。 在chrome中,它下载文件,我已经向您展示了,但是在例如Internet Explorer中,它只是将数据打印到客户端而不下载它真正的问题是为什么它不只是在chrome中打印数据,为什么它会下载它而不是像Internet Explorer那样打印它,我该如何解决它?(供您参考:我下载的所有文件前面都有文件名,这就是我把它放在那里的原因(

http 请求: 更新:

POST /upload?file-name=Screenshot_2.png HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Content-Length: 3534
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Content-Type: application/octet-stream
Origin: http://127.0.0.1
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Referer: http://127.0.0.1/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,en-US;q=0.8,he;q=0.7

看起来您发送的不是 HTTP/1 响应,而是 HTTP/0.9 响应(请注意,我说的是服务器发送的响应,而不是客户端发送的请求(。HTTP/1 响应由 HTTP 标头和 HTTP 正文组成,类似于 HTTP 请求的构造方式。相反,HTTP/0.9响应仅包含实际的正文,即没有标头,因此标头中没有元信息,这些信息告诉浏览器如何处理正文。

HTTP/0.9已经过时了25年,但一些浏览器仍然支持它。当浏览器收到HTTP/0.9请求时,它可以使用它,因为HTTP标头没有定义的含义。浏览器可能会尝试将它解释为HTML,作为纯文本,提供下载,完全拒绝它...... - 无论如何。

解决问题的方法是在发送正文之前发送一个实际的 HTTP 响应标头,即像这样

cs.send("HTTP/1.0 200 okrnContent-type: application/octet-streamrnrn")
with open(path, 'rb') as re:
...
cs.send(read)

无论如何:HTTP比你想象的要复杂得多。有已建立的库来处理这种复杂性。如果您坚持不使用任何库,请学习标准以避免此类问题。

最新更新