(PHP) Проблема с именем файла после его загрузки - PullRequest
0 голосов
/ 29 апреля 2020

Во время написания PHP -скрипта я застрял в проблеме, которую не могу разрешить.

* * * * * * Сценарий PHP состоит в том, что пользователь может загрузить файл .mp4. Загрузка работает без проблем, но загруженный файл не может быть воспроизведен.

Вот код:

<?php
  $filepath = "/www/servermedia/technounion.mp4";
  $filename = basename($filepath);

  header("Content-type: video/mp4");
  header("Content-Disposition: attachment; filename=.$filename");
  readfile($filename);
  exit;
 ?>

После загрузки файла .mp4 его невозможно воспроизвести. Это выглядит следующим образом: enter image description here

Сообщение об ошибке означает, что Windows Media Player не может воспроизвести файл, поскольку, вероятно, проигрыватель не поддерживает код c. Я уже пробовал с VL C, но он тоже не работает.

РЕДАКТИРОВАТЬ:

Сравнивая оба размера файлов, загруженный файл имеет размер всего пару байтов вместо 3,73 МБ файла на сервере enter image description here

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

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

<?php
  $filepath = "/www/servermedia/technounion.mp4";
  $filename = basename($filepath);
  header('Content-Type: video/mp4');
  header('Content-Disposition: attachment; filename="' . $filename . '"');
  readfile($filename);
  exit;
?>

Но я предлагаю более сложный способ:

<?php
  $filepath = $_SERVER['DOCUMENT_ROOT'] . "/www/servermedia/technounion.mp4";
  $filename = basename($filepath);
  header('Content-Type: video/mp4');
  header('Content-Disposition: attachment; filename="' . $filename . '"');
  header('Content-Transfer-Encoding: binary');
  header('Connection: Keep-Alive');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Content-Length: ' . sprintf("%u", filesize($filepath)));
  set_time_limit(0);
  $fh = fopen($filepath, "rb");
  while (!feof($fh)) {
    echo fgets($fh);
    ob_flush();
    flush();
  }
  fclose($fh);
  exit;
?>

$_SERVER['DOCUMENT_ROOT'] полезно, чтобы получить полный путь от сервера

set_time_limit(0) полезно, чтобы избежать любого тайм-аута во время загрузки

fgets() полезно для чтения больших файлов

ob_flush() и flush() убедитесь, что в буфере нет других выходных данных

Надеюсь, это поможет.

0 голосов
/ 29 апреля 2020

Является ли загруженный файл точно таким же размером файла?

Существует ли тип содержимого на вашем веб-сервере? заголовок («Content-Type: video / mp4»); Обратите внимание на заглавную букву 'T' для типа.

Это, возможно, стоит проверить, чтобы убедиться, что вы можете подавать содержимое файла в строке: http://www.phpmind.com/blog/2016/10/how-to-use-php-to-output-an-mp4-video/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...