首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单python 3 web服务器,在浏览器中显示图像

简单python 3 web服务器,在浏览器中显示图像
EN

Stack Overflow用户
提问于 2018-03-30 11:25:42
回答 2查看 2K关注 0票数 1

我正在尝试制作一个简单的http服务器,它可以作为客户端通过web浏览器访问,仅使用python 3中的套接字模块。我已经了解了http响应如何与其头一起工作。实际上,我通过Chrome工具确认浏览器能够理解我的响应,但是图像无法显示(它只显示浏览器中的一个黑色屏幕,这意味着图像有问题)。我的猜测是,我不正确地将图像的主体连接到响应字符串,或者我对它进行了错误的编码。这是我的代码:

代码语言:javascript
复制
import socket
import base64
import os

HOST_N = socket.gethostname()
HOST, PORT = socket.gethostbyname(HOST_N), 10080

print(HOST)

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_IP) 
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print('Serving HTTP on port %s ...' % PORT)
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    option = request.decode().split(' ')
    print(request)

    if option[1]:

        if option[1]=='/success.jpg':

            with open("success.jpg", "r+b") as image_file:
                encoded_string = base64.b64encode(image_file.read())
                size = str(os.path.getsize("success.jpg"))

                HTTP_RESPONSE = "HTTP/1.1 200 OK\r\n" + "Connection: close\r\n" + "Content-Type: image/jpg\r\n" + "Content-Lenght: "+ size + "\r\n\r\n" + str(encoded_string)

                print(HTTP_RESPONSE)
                client_connection.sendall(HTTP_RESPONSE.encode('ASCII'))



        else:

            with open("404.jpg", "r+b") as image_file:
                encoded_string = base64.b64encode(image_file.read())
                size = str(os.path.getsize("404.jpg"))

                HTTP_RESPONSE = "HTTP/1.1 200 OK\n" + "Connection: close\n" + "Content-Type: image/jpg\n" + "Content-Lenght: "+ size + "\n\n" + str(encoded_string)

                client_connection.sendto(HTTP_RESPONSE.encode('ASCII'), (HOST, PORT))

    else:
        pass    

    client_connection.close()

目前使用python 3.5.2和基本操作系统0.4.1 Loki。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-30 11:44:28

您有一个内容长度错误也可以节省cpu,不需要编码,因为您宣布了一个具有内容类型的二进制内容:

代码语言:javascript
复制
#
data = image_file.read()
HTTP_RESPONSE = b'\r\n'.join([
    b"HTTP/1.1 200 OK",
    b"Connection: close",
    b"Content-Type: image/jpg",
    bytes("Content-Length: %s" % len(data),'utf-8'),
    b'', data 
] )
client_connection.sendall(HTTP_RESPONSE) 
#

另外,如果对内容进行编码,则必须公布编码内容的大小(以字节为单位),而不是源数据(文件)的大小。

票数 1
EN

Stack Overflow用户

发布于 2018-03-30 11:47:27

您需要的是所发送的字节的确切大小,实际上是文件大小,而不是它在len()中得到的utf-8表示:

代码语言:javascript
复制
size = str(os.stat('404.jpg').st_size)

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49573531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档