为什么我的Content-Length标头错了?

时间:2010-08-24 22:44:31

标签: php excel string strlen

我试图在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;

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

5 个答案:

答案 0 :(得分:13)

您告诉用户代理期望strlen($ data)然后实际发送$ header。“\ n”。$ 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;

答案 1 :(得分:2)

strlen会返回正确答案:

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

// prints 5

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

答案 2 :(得分:1)

在获取字符串长度之前,请使用'\t'删除'\n'中的$datastr_replace符号,或者如果strlen()确实存在错误,请删除其他函数(我没有检查过。)

答案 3 :(得分:1)

内容长度标题不包括标题的长度加上响应的主体。

  

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

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

答案 4 :(得分:1)

您同时回复了$header$data,但您只将Content-Length设置为$data的大小。

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