加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在没有Content-Length标头的情况下流式传输HTTP文件

发布时间:2020-12-13 18:27:24 所属栏目:PHP教程 来源:网络整理
导读:是否可以将文件上传到apache php服务器而不包含内容长度标题? 我正在尝试流式传输我正在创建的文件作为文件上传.当我不使用内容长度标题时,我得到了apache“501 Method Not Implemented”. $sock = fsockopen($host,80,$errno,$error);fwrite($sock,"POST $
是否可以将文件上传到apache php服务器而不包含内容长度标题?

我正在尝试流式传输我正在创建的文件作为文件上传.当我不使用内容长度标题时,我得到了apache“501 Method Not Implemented”.

$sock = fsockopen($host,80,$errno,$error);
fwrite($sock,"POST $resource HTTP/1.1rn" .
                     "Host: $hostrnrn");
fwrite($sock,fread($readHandle,filesize($file)));

如果我包含内容长度,它可以正常工作.

服务器正在从php://输入读取

根据HTTP规范,技术上不需要指定Content-Length标头.从 RFC 2616 14.13开始:

Applications SHOULD use this field to indicate the transfer-length of
the message-body,unless this is prohibited by the rules in section
4.4.

但是,对于大多数服务器来说,这是一个非常标准的要求,如果Content-Length标头丢失或指定不正确,它们通常会发回错误响应.出于所有意图和目的,在这种情况下应该等同于MUST.

问题是(特别是对于保持活动连接),服务器不知道您的请求消息何时实际结束而没有Content-Length标头.如果您正在流式传输请求实体主体,则另一个选项是发送Transfer-Encoding:chunked标头并一次手动发送一个实体主体块.

总而言之,如果您希望发送带有消息的实体主体但又不想发送Content-Length标头,那么您唯一真正的选择是发送分块的HTTP消息.如果您想要流式传输该实体主体并且不知道其长度,则基本上这是必需的.

如何对HTTP实体主体进行块编码以进行流式处理…

Transfer-Encoding:chunked意味着您根据RFC2616 Sec3.6.1中规定的约束对HTTP消息的实体主体进行编码.这种编码格式可以应用于请求或响应(duh,它们都是HTTP消息).这种格式非常有用,因为它允许您在了解实体主体的大小之前立即开始发送HTTP消息,甚至可以确切地知道该实体主体的内容.实际上,这正是PHP在没有发送像header这样的长度标题(‘Content-Length:42’)的情况下回显任何输出时透明地为你做的事情.

我不打算深入讨论分块编码的细节 – 这就是HTTP规范的用途 – 但是如果你想要流一个请求实体,你需要做这样的事情:

<?php

$sock = fsockopen($host,$error);
$readStream = fopen('/some/file/path.txt','r+');

fwrite($sock,"POST /somePath HTTP/1.1rn" .
              "Host: www.somehost.comrn" .
              "Transfer-Encoding: chunkedrnrn");

while (!feof($readStream)) {
    $chunkData = fread($readStream,$chunkSize);
    $chunkLength = strlen($chunkData);
    $chunkData = dechex($chunkLength) . "rn$chunkDatarn";

    fwrite($sock,$chunkData);
}

fwrite($sock,"0rnrn");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读