Jam*_*ett 8 php apache http http-streaming
是否可以将文件上传到apache php服务器而不包含内容长度标题?
我正在尝试将我正在创建的文件作为文件上传流式传输.当我不使用内容长度标题时,我得到了apache"501 Method Not Implemented".
$sock = fsockopen($host,80,$errno, $error);
fwrite($sock, "POST $resource HTTP/1.1\r\n" .
"Host: $host\r\n\r\n");
fwrite($sock,fread($readHandle,filesize($file)));
Run Code Online (Sandbox Code Playgroud)
如果我包含内容长度,它工作正常.
服务器正在从php://输入读取
rdl*_*rey 16
根据HTTP规范,技术上不需要指定Content-Length标头.来自RFC 2616 14.13:
应用程序应该使用此字段来指示消息正文的传输长度,除非4.4节中的规则禁止这样做.
但是,对于大多数服务器来说,这是一个非常标准的要求,如果Content-Length标头丢失或指定不正确,它们通常会发回错误响应.出于所有意图和目的,在这种情况下应该等同于MUST.
问题是(特别是对于保持活动连接),服务器不知道您的请求消息何时实际结束而没有Content-Length标头.如果您正在流式传输请求实体主体,则另一个选项是发送Transfer-Encoding: chunked标头并一次手动发送一个实体主体块.
因此,在总结,如果你想与你的消息发送实体主体,但不希望发出一个Content-Length头,你的唯一真正的选择是发送分块HTTP消息.如果您想要流式传输该实体主体并且不知道其长度,则基本上这是必需的.
Transfer-Encoding: chunked表示您根据RFC2616 Sec3.6.1中规定的约束编码HTTP消息的实体主体.这种编码格式可以应用于请求或响应(duh,它们都是HTTP消息).这种格式是非常有用的,因为它可以让你开始发送一个HTTP消息马上要知道实体主体的大小,甚至什么是实体主体将是前.实际上,这正是PHP在echo没有发送长度标题的情况下对您进行透明的操作header('Content-Length: 42').
我不打算详细介绍分块编码 - 这就是HTTP规范的用途 - 但是如果你想要流一个请求实体,你需要做这样的事情:
<?php
$sock = fsockopen($host,80,$errno, $error);
$readStream = fopen('/some/file/path.txt', 'r+');
fwrite($sock, "POST /somePath HTTP/1.1\r\n" .
"Host: www.somehost.com\r\n" .
"Transfer-Encoding: chunked\r\n\r\n");
while (!feof($readStream)) {
$chunkData = fread($readStream, $chunkSize);
$chunkLength = strlen($chunkData);
$chunkData = dechex($chunkLength) . "\r\n$chunkData\r\n";
fwrite($sock, $chunkData);
}
fwrite($sock, "0\r\n\r\n");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9516 次 |
| 最近记录: |