不需要 html 写入文本文件

writing not required html to a text file

我正在将我的输出写入文本文件,然后使用 php 下载它,但问题是它正在保存输出,但它也将 HTML 的整个结构保存到文本文件中还。我不知道为什么它的发生试图解决它但没有弄清楚如何解决。

我想保存来自 fwrite($fh, $formatted_url."\n");

的输出

下面是我的代码:

function get_m3u8_video_segment($url,$portnum=80,$from,$to) 
        {   
           $file_name="urlscan.txt";
           $fh = fopen($file_name, 'w') or die("Unable to open file!");
           for ($x = $from; $x <= $to; $x++)
           {  
               $formatted_url="{$url}:{$portnum}/s-{$x}.m3u8";
                //echo "URL is: $formatted_url <br>";
               //$contents = file_get_contents($formatted_url);
               $contents = get_web_page( $formatted_url );
               if ((strpos($contents, 'not found') !== false)||(strpos($contents, 'EXTM3U') !== false))
               {
                   echo" $formatted_url<br>";

                   fwrite($fh, $formatted_url."\n");
               }

           }
           //header download
           header("Content-Disposition: attachment; filename=\"" . $file_name . "\"");
           header("Content-Type: application/force-download");
           header('Expires: 0');
           header('Cache-Control: must-revalidate');
           header('Pragma: public');
           header("Content-Type: text/plain");

        }
        get_m3u8_video_segment($url,$portnum,$from,$to);
     }

如果您的 PHP 脚本中的其他地方有其他 HTML 内容,那么它也将按正常方式输出,除非在这种情况下它将成为下载文件的一部分。如果您不希望这种情况发生,那么您必须在输出您真正想要的内容后使用 exit(); 命令停止您的脚本。在您的脚本中,看起来您可以在调用函数后立即执行此操作。 (但如果您在此之前已经输出了一些 HTML,则需要对脚本进行更大幅度的更改。)

N.B。我很惊讶你没有收到关于 headers 已经发送的警告?如果您在回显某些内容后尝试设置 headers,通常会发生这种情况。检查您的日志文件。通常你应该先输出 headers。

此外,除非您想将其保留用于其他目的,否则将任何内容保存到 urlscan.txt 是没有用的 - 它不会在您的下载过程中发挥任何作用。而且每次执行此脚本时它都会被覆盖。 headers 将导致浏览器将输出内容(即 PHP 脚本发送到常规输出的任何内容)视为文本文件 - 但这与文本文件不同您服务器的磁盘,其内容可能不同。

您输出的内容(通过 echo" $formatted_url<br>";)恰好与您添加到 urlscan 文件(通过 fwrite($fh, $formatted_url."\n");)的内容相似,我认为这可能会让您感到困惑,认为您是输出 urlscan.txt 的内容,但你不是 - 你的 PHP header 告诉浏览器处理你脚本的输出(通常只会进入浏览器 window 作为 HTML 页面)作为文件 - 但它是 a) 一个新文件,b) 在到达浏览器之前实际上根本不是文件,它只是对 HTTP 请求的响应。浏览器根据其解释 headers.

的方式将其转换为客户端计算机上的文件

还有一点:你输出的内容需要是文本格式,而不是HTML,所以你需要把你的echo里面的<br>改成\n.

最后,你把content-typeheader输出了两次,这是胡说八道。 HTTP 请求或响应只能有一种内容类型。在这种情况下,text/plain 是有效的 MIME 类型,另一个不是真实的。

考虑到以上所有因素,您的代码可能会更好地编写为:

function get_m3u8_video_segment($url, $portnum=80, $from, $to) 
{   
  //header download
  $file_name="urlscan.txt";
  header("Content-Disposition: attachment; filename=\"" . $file_name . "\"");
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header("Content-Type: text/plain");

  for ($x = $from; $x <= $to; $x++)
  {  
    $formatted_url="{$url}:{$portnum}/s-{$x}.m3u8";
    $contents = get_web_page( $formatted_url );

    if ((strpos($contents, 'not found') !== false)||(strpos($contents, 'EXTM3U') !== false))
    {
      echo" $formatted_url\n";
    }
  }
}
get_m3u8_video_segment($url, $portnum, $from, $to);
exit();