这个http脚本在我的Unntu上的gnome-terminal(以及Mac上的Aleksey)上运行得很好,但是在win7上,一个小方块被加载到chrome浏览器中。我需要做什么才能通过本地主机发送JPEG,以便在win7浏览器中显示?根据Per Holger的评论,我需要解决内容编码问题,但到目前为止我所尝试的所有内容在win7上没有任何区别(并且在没有任何明确内容编码的情况下仍可在Ubuntu中正常加载)。 ?
PS C:\Users\user_name\Ruby\http_test> ls
basic_http.rb
lolcat.jpg
PS C:\Users\user_name\Ruby\http_test> ruby basic_http.rb
# very basic http server
require 'socket'
def send_200(socket, content)
socket.puts "HTTP/1.1 200 OK\r\n\r\n#{content}" # <-- Correct? (Per Holger)
socket.close
end
server = TCPServer.new 2016
loop do
Thread.start(server.accept) do |client|
request = client.gets
if request.start_with?("GET")
url = request.split(" ")[1]
if url.start_with?("/images/")
file = url.sub("/images/", "")
picture = File.read(file) # <-- initially Aleksey pointed out
send_200(client, picture) # <-- a variable name mismatch here
else # pictures/picture... heh.
send_200(client, "hello!")
end
end
end
end
FWIW:Ruby 2.2,win7&amp;与此demo一起编码。
答案 0 :(得分:1)
你的变量名只有一个拼写错误
您将文件读取到pictures
pictures = File.read(file)
但您将其发送为picture
send_200(client, picture)
所以你只需要编辑变量名。
将请求处理包装到begin
块中可能是个好主意。
Thread.start(server.accept) do |client|
begin
...
rescue => ex
puts ex
end
end
通过这种方式,您可以查看是否出现问题。
答案 1 :(得分:0)
要在win7系统上将jpeg加载到浏览器中,File.read命令需要显式地解决二进制内容编码,例如: File.binread("foo.bar")
每个:
https://ruby-doc.org/core-2.1.0/IO.html#method-c-binread
if url.start_with?("/images/")
file = url.sub("/images/", "")
picture = File.binread(file) # <-- Thank you Holger & Aleksey!!!
send_200(client, picture)
感谢Aleksey和Holger!