我正在尝试使用CGI和分块编码(“Transfer-Encoding:chunked”HTTP头字段。)这样可以在没有内容长度标头的情况下发送文件。我在Ruby中编写了一个简约的CGI应用程序来试用它。我的代码如下(chunked.rb):
#!/usr/bin/ruby
puts "Date: Fri, 28 Nov 2015 09:59:59 GMT"
puts "Content-Type: application/octet-stream; charset=\"ASCII-8BIT\""
puts "Content-Disposition: attachment; filename=image.jpg"
puts "Transfer-Encoding: chunked"
puts
File.open("image.jpg","rb"){|f|
while data=f.read(32)
STDOUT.puts data.size.to_s(16)
STDOUT.puts data
end
STDOUT.puts "0"
STDOUT.puts
}
我从这里接受了这个想法和分块格式示例:https://www.jmarshall.com/easy/http/
HTTP/1.1 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
1a; ignore-stuff-here
abcdefghijklmnopqrstuvwxyz
10
1234567890abcdef
0
some-footer: some-value
another-footer: another-value
[blank line here]
由于我的CGI应用程序位于Apache cgi-bin目录中,我可以发出cURL:
curl http://example.com/cgi-bin/chunked.rb -O -J
cURL应该重新整理来自块的原始image.jpg文件,但遗憾的是保存的文件不完整,它比原始文件小,我从cURL得到错误信息:
curl: (56) Malformed encoding found in chunked-encoding
但是,当我将行data=f.read(32)
更改为data=f.read(1024*50)
之类的内容时,文件会正确保存。使用来自服务器的另一个更大的文件使CGI应用程序再次无用,我再次收到相同的错误消息。我该怎么做才能使我的CGI应用程序正常工作并正确发送文件?
答案 0 :(得分:2)
所以工作示例:
puts "Date: Fri, 28 Nov 2015 09:59:59 GMT"
puts "Content-Type: application/octet-stream; charset=\"ASCII-8BIT\""
puts "Content-Disposition: attachment; filename=image.jpg"
puts "Transfer-Encoding: chunked"
puts
File.open("image.jpg","rb"){|f|
while data=f.read(32)
STDOUT.puts data.size.to_s(16)
STDOUT.print data
STDOUT.puts
end
STDOUT.puts "0"
STDOUT.puts
}