我的 Content-Length 标头错误?发生什么事了?

问题描述 投票:0回答:5

我试图在 php 5.2 中使用 strlen() 找出字符串的确切长度。字符串 ($data) 包含 ' ' 和 ' '.

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;

这不会返回准确的长度(它小于实际长度)。请指教。

php excel string strlen
5个回答
14
投票

您告诉用户代理期待 strlen($data),然后实际发送 $header。” “.$data!在代码末尾尝试类似的内容...

  $output=$header."\n".$data;

  // 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($output); // tells file size
  header("Pragma: no-cache");
  header("Expires: 0");

  // output data
  echo $output;

2
投票

strlen返回正确答案:

echo strlen("1\n2\t3");

// prints 5

您需要更仔细地检查您的输入。


2
投票

内容长度标头不包括标头长度加上响应正文。

Content-Length: 响应正文的长度(以八位字节为单位(8 位字节))

仅供参考,因为“答案”中使用的变量是标题+数据。不要被误导。


1
投票

在获取字符串长度之前,如果

'\t'
确实有错误(我还没有检查过),请使用
'\n'
或类似的其他函数从
$data
中删除
str_replace
strlen()
符号。


1
投票

您回显了

$header
$data
,但您仅将
Content-Length
设置为
$data
的大小。

如果

$header
包含其他 HTTP 标头,则应使用
$header
输出
header()
。否则,您应该将
Content-Length
设置为
strlen($header."\n".$data)

© www.soinside.com 2019 - 2024. All rights reserved.