我的 Content-Length 标头错误?发生了什么?
我试图在 php 5.2 中使用 strlen() 找出字符串的确切长度。字符串 ($data) 包含“\t”和“\n”。
echo strlen($data);
代码:
// fetch table header
$header = '';
while ($fieldData = $result->fetch_field()) {
$header .= $fieldData->name . "\t";
}
// fetch data each row, store on tabular row data
while ($row = $result->fetch_assoc()) {
$line = '';
foreach($row as $value){
if(!isset($value) || $value == ""){
$value = "\t";
}else{
// important to escape any quotes to preserve them in the data.
$value = str_replace('"', '""', $value);
// needed to encapsulate data in quotes because some data might be multi line.
// the good news is that numbers remain numbers in Excel even though quoted.
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim($line)."\n";
}
// this line is needed because returns embedded in the data have "\r"
// and this looks like a "box character" in Excel
$data = str_replace("\r", "", $data);
// Nice to let someone know that the search came up empty.
// Otherwise only the column name headers will be output to Excel.
if ($data == "") {
$data = "\nno matching records found\n";
}
// create table header showing to download a xls (excel) file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$export_filename");
header("Cache-Control: public");
header("Content-length: " . strlen($data); // tells file size
header("Pragma: no-cache");
header("Expires: 0");
// output data
echo $header."\n".$data;
这不会返回确切的长度(它小于实际长度)。请指教。
I am trying to find out the exact length of a string using strlen() in php 5.2. The string ($data) contains '\t' and '\n'.
echo strlen($data);
Code:
// fetch table header
$header = '';
while ($fieldData = $result->fetch_field()) {
$header .= $fieldData->name . "\t";
}
// fetch data each row, store on tabular row data
while ($row = $result->fetch_assoc()) {
$line = '';
foreach($row as $value){
if(!isset($value) || $value == ""){
$value = "\t";
}else{
// important to escape any quotes to preserve them in the data.
$value = str_replace('"', '""', $value);
// needed to encapsulate data in quotes because some data might be multi line.
// the good news is that numbers remain numbers in Excel even though quoted.
$value = '"' . $value . '"' . "\t";
}
$line .= $value;
}
$data .= trim($line)."\n";
}
// this line is needed because returns embedded in the data have "\r"
// and this looks like a "box character" in Excel
$data = str_replace("\r", "", $data);
// Nice to let someone know that the search came up empty.
// Otherwise only the column name headers will be output to Excel.
if ($data == "") {
$data = "\nno matching records found\n";
}
// create table header showing to download a xls (excel) file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=$export_filename");
header("Cache-Control: public");
header("Content-length: " . strlen($data); // tells file size
header("Pragma: no-cache");
header("Expires: 0");
// output data
echo $header."\n".$data;
This does not return the exact length (its less than the actual length). Please advice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您告诉用户代理期望 strlen($data),然后实际发送 $header."\n".$data!在代码末尾尝试这样的事情......
You are telling the user agent to expect strlen($data) and then actually sending $header."\n".$data! Try something like this at the end of your code...
strlen 返回正确的答案:
您需要更多地检查您的输入小心。
strlen returns the correct answer:
You will need to examine your input more carefully.
内容长度标头不包括标头长度加上响应正文。
仅供参考,因为“答案”中使用的变量是标头 + 数据。不要被误导。
The content-length header does NOT include the length of the headers plus the body of the response.
Just FYI since the variables used in the "answer" are header + data. Do not be misled.
在获取字符串长度之前,请使用
str_replace
从$data
中删除'\t'
和'\n'
符号或者使用其他类似的函数,如果strlen()
确实有错误(我还没有检查过)。Before getting length of string, delete
'\t'
and'\n'
symbols from$data
withstr_replace
or with other function like that ifstrlen()
really has bug (I haven't checked that).您回显
$header
和$data
,但仅将Content-Length
设置为$data
的大小。如果
$header
包含其他 HTTP 标头,则应使用header()
输出$header
。否则,您应该将Content-Length
设置为strlen($header."\n".$data)
。You echo both
$header
and$data
, but you only setContent-Length
to the size of$data
.If
$header
contains additional HTTP-headers, you should output$header
usingheader()
. Otherwise, you should setContent-Length
tostrlen($header."\n".$data)
.