PHP заставляет браузер загружать файлы (двумя способами)

Я хочу, чтобы php-скрипт загружал файлы любого типа, не открывая его. Я нашел следующие функции, которые мне кажутся немного другими, но я не знаю, что лучше. Пожалуйста, дайте мне знать, какой из них лучше и надежнее:

  1. Из руководства по PHP

    $file = 'monkey.gif';
    
    if (file_exists($file)) {
      header('Content-Description: File Transfer');
      header('Content-Type: application/octet-stream');
      header('Content-Disposition: attachment; filename='.basename($file));
      header('Content-Transfer-Encoding: binary');
      header('Expires: 0');
      header('Cache-Control: must-revalidate');
      header('Pragma: public');
      header('Content-Length: ' . filesize($file));
      ob_clean();
      flush();
      readfile($file);
      exit;
    }
    
  2. Из другого урока:

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=\"{$file->filename}\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . $filesize);
    
    // download
    // @readfile($file_path);
    $dwn_file = @fopen($file_path,"rb");
    if ($dwn_file) {
      while(!feof($dwn_file)) {
        print(fread($dwn_file, 1024*8));
        flush();
        if (connection_status()!=0) {
          @fclose($dwn_file);
          die();
        }
      }
      @fclose($dwn_file);
    }
    

3 ответа

Решение

На самом деле оба они очень похожи, когда вы смотрите на отправляемые заголовки, что и вызывает загрузку. Разница в том, как файл читается. Первый использует readfile() как абстракция, в то время как второй читает байт за байт.

Второй пример также использует @ Символ несколько раз, чтобы подавить ошибки, которые не очень хорошая вещь для копирования.

Я бы использовал код из руководства по PHP. Это проще, менее подвержено ошибкам и более читабельно.

Они оба в основном одинаковы. То, что вы хотите, это заголовки

header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=\"{$file->filename}\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $filesize);
header('Content-Type: image/gif');

А затем просто выведите файл. Это можно сделать разными способами, но я бы порекомендовал просто:

readfile($filename);

как это само за себя. Он прочитает файл и выведет его в буфер вывода (т. Е. В браузер).

Однако обратите внимание, что заголовок Content-Type должен быть установлен на image/gif, если это то, что вы выводите.

Это мнение, но я бы использовал первое, оно намного быстрее и чище.

Другие вопросы по тегам