Я пересылаю файлы PDF из-за POST, но $ _FILES type не обнаруживает их как таковой

Хорошие, у меня есть формуляр, в котором я пересылаю файл.PDF Проблема, дело в том, что от случая к случаю, если он обнаруживает в PDF и другие разы в другие файлы с этим же самым завершением, он показывает мне, что они не этого типа. Что могло бы делать? Я оставляю им здесь краткое содержание моего кода

<form action="upload_book_prueba.php" method="post" class="regisform" enctype="multipart/form-data">
<label>Subir el ebook </label>
<input type="file" name="ebook"   />
<input type="submit" name="enviar" value="Upload">
</form>

<?php

if ($_SERVER['REQUEST_METHOD'] == "POST"){
extract($_POST);
$ebook=$_FILES['ebook']['tmp_name'];
if($_FILES['ebook']['type']=="application/pdf") {                                           
$ruta_ebook="ebook/".$nombre_ebook.".pdf";
if(copy($ebook,$ruta_ebook)){
echo "Entra aqui";
}else{
echo "No entro";
}
}
}

ЗАМЕТЬ: $ nombre_ebook соответствует консультации max пойдите таблицы ebooks, и он погружает 1 в это число.

4
задан 10.01.2017, 15:32
0 ответов

Не используй $_FILES['ebook']['type'] == "application/pdf" в пользу следующих двух мотивов:

  1. Зависит от браузера посылать или нет правильный тип (может быть я послал характерный другой как application/octet-stream).
  2. После того, как предоставляться с браузера клиента (и не быть не обнаруженным на сервере, где у тебя есть контроль, из как делается проверка) может быть легко измененным пользователем для злонамеренных концов.

В Вашем месте ты был бы должен использовать mime_content_type() и позволять в твой сервер обнаруживать тип анализируя контент яркого файла используя магические числа (magic.mime) твоего сервера.


Пример с mime_content_type():

<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post"
      class="regisform" enctype="multipart/form-data">
  <label>
    Subir el ebook (máximo <?=
      htmlspecialchars(ini_get('upload_max_filesize'))
    ?>)
  </label>
  <input type="file" name="ebook" />
  <input type="submit" name="enviar" value="Upload" />
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  extract($_POST);
  $ebook = $_FILES['ebook']['tmp_name'];
  if ($_FILES['ebook']['error'] !== 0) {
    echo 'Error al subir el archivo (¿demasiado grande?)';
  } else {
    if (
      mime_content_type($_FILES['ebook']['tmp_name']) == 'application/pdf'
    ) {
      $ruta_ebook = 'ebook/' . $nombre_ebook . '.pdf';
      if (move_uploaded_file($ebook, $ruta_ebook)) {
        echo "Entra aqui";
      } else {
        echo "No entro";
      }
    }
  }
}

Пример с finfo::file():

<form action="<?= $_SERVER['PHP_SELF'] ?>" method="post"
      class="regisform" enctype="multipart/form-data">
  <label>
    Subir el ebook (máximo <?=
      htmlspecialchars(ini_get('upload_max_filesize'))
    ?>)
  </label>
  <input type="file" name="ebook" />
  <input type="submit" name="enviar" value="Upload" />
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  extract($_POST);
  $ebook = $_FILES['ebook']['tmp_name'];
  if ($_FILES['ebook']['error'] !== 0) {
    echo 'Error al subir el archivo (¿demasiado grande?)';
  } else {
    $finfo = new finfo(FILEINFO_MIME);
    if (
      strpos($finfo->file($_FILES['ebook']['tmp_name']),
        'application/pdf') === 0
    ) {
      $ruta_ebook = 'ebook/' . $nombre_ebook . '.pdf';
      if (move_uploaded_file($ebook, $ruta_ebook)) {
        echo "Entra aqui";
      } else {
        echo "No entro";
      }
    }
  }
}

Увеличивая размер полученных файлов

Идеальное состоит в том, чтобы изменять файл php.ini и конфигурировать upload_max_filesize и post_max_size с большей стоимостью.

Например, чтобы конфигурировать 32 MiB используя нотацию shorthand, мы будем должны помещать:

upload_max_filesize = 32M
post_max_size = 32M

Другой альтернативный выбор состоит в том, чтобы создавать файл .htaccess (если ты используешь индеец-апачи, и дали возможность Вашему использованию) со следующим контентом:

php_value upload_max_filesize 32M
php_value post_max_size 32M
3
ответ дан 03.12.2019, 17:46
  • 1
    Но официальная страница PHP показывает ее как устаревшая функция: php.net/manual/es/function.mime-content-type.php –  10.01.2017, 16:00
  • 2
    Потому что сейчас рекомендуется интерфейс, предложенный Fileinfo с funció n finfo_file () / finfo:: file , но пока продолжи давать услугу (даже в PHP 7.1), así который ты можешь использовать любая из двух (я предложил эту тебе, потому что это была та, кто помнила памяти). Если ты нуждаешься в примере có mo использовать funció n (одна или другая) dí melo и я изменяю твой có я говорю, чтобы использовать эту функциональность, тебе состояла в том, чтобы объяснять идею о моем ответе raí z проблемы, которую ты выдвигаешь в твоем вопросе. –  10.01.2017, 16:05
  • 3
    Если ты можешь пересылать пример ты это agradecerí в, потому что у меня есть минуты пытаясь и он дает мне ошибку в открытии файла –  10.01.2017, 16:16
  • 4
    Я издал тебе ответ, чтобы помещать тебе два примера. Много глаз с strpos(), comparació n она строгая с 0 (совпадение в начале), так как тип избаловал, может содержать, ademá s, codificació n использованная. Пример: application/pdf; charset=binary. –  10.01.2017, 18:16
  • 5
    Utilicé mime_content_type () и уже có я говорю, что он не дает ошибку, вещь состоит в том, что остается проблема, которой какие-то файлы, что я пересылаю PDF, он говорит мне, что это не PDF ¿ из-за qué это происходит? –  10.01.2017, 19:03