2015-06-13 5 views
0

I'm с помощью этого кода PHP для загрузки изображений в папку, но я хотел бы, чтобы PDF файлы, которые будут загружены также, поэтому я изменил немного код:Определение файла в формате PDF и загрузить его в папку

<?php 

    $target_dir = "extra_images/"; 
    $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 
    $uploadOk = 1; 
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
    $textFileType = pathinfo($target_file,PATHINFO_EXTENSION); 

    // Check if image file is a actual image or fake image 
    if(isset($_POST["submit"])) { 
     $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); 
      if($check !== false) { 
      //echo "<div class=\"alert alert-success\" role=\"alert\"><strong><span class=\"glyphicon glyphicon-ok\" aria-hidden=\"true\"></span> Correct image type.</strong></div>"; 
        $uploadOk = 1; 
       } else { 
        echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>File is not an image.</strong></div>"; 
        $uploadOk = 0; 
       } 
      } 
      // Check if file already exists 
      if (file_exists($target_file)) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>File already exists.</strong></div>"; 
       $uploadOk = 0; 
      } 
      // Check file size 
      if ($_FILES["fileToUpload"]["size"] > 3750000) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>Your file is too large.</strong></div>"; 
       $uploadOk = 0; 
      } 
      // Allow certain file formats 
      if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" && $textFileType != "pdf") { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>Only jpg, jpeg, png, gif and pdf (for the Plan Article) files are allowed.</strong></div>"; 
       $uploadOk = 0; 
      } 
      // Check if $uploadOk is set to 0 by an error 
      if ($uploadOk == 0) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>The file was not uploaded.</strong></div>"; 
      // if everything is ok, try to upload file 
      } else { 
       if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 

        echo "<div class=\"alert alert-success\" role=\"alert\">The file <strong>". basename($_FILES["fileToUpload"]["name"]). "</strong> has been uploaded.</div><br>Please copy this filename: <span class=\"form-inline\"><input type=\"text\" value=\"". basename($_FILES["fileToUpload"]["name"]). "\" class=\"form-control input-sm\" style=\"width:220px;\" /></span> And paste it in an empty Extra image field above and save the form."; 
       } else { 
        echo "<div class=\"alert alert-danger\" role=\"alert\">There was an error uploading your file.</div>"; 
       } 
    } 
    echo "</br></br><p><button class=\"btn btn-default pull-right\" style=\"margin-right:5px;\" type=\"submit\" onclick=\"javascript:history.go(-1)\"><span class=\"glyphicon glyphicon-step-backward\" aria-hidden=\"true\"></span> Back</button></p>"; 
?> 

Я добавил этот бит:

&& $textFileType != "pdf" and this: $textFileType = pathinfo($target_file,PATHINFO_EXTENSION); 

Но это изменения я сделал не работает, она по-прежнему возвращает "this is not an image" сообщение.

Какая часть кода определяет тип файла? $ imageFileType - специальная переменная, используемая php для идентификации типов файлов?

Я действительно смущен. Может ли кто-нибудь помочь?

+0

вопрос, так это бросить эту ошибку еще до того, вы добавили, что новая линия? –

+0

проблема заключается в том, что вам нужно использовать оператор OR '||' для всей этой строки, а не для оператора AND '&&'. Вы говорите PHP, чтобы проверить, загружен ли файл JPG, PNG и GIF и PDF. –

+0

Нет, рабочий сценарий отлично подходит для файлов типа изображения. Я получил его здесь: http://www.w3schools.com/php/php_file_upload.asp –

ответ

0

Тип файла для PDF-файлов - application/pdf, если вы хотите проверить расширение.

Однако, хотя вы можете проверить расширения файлов, но это не очень надежный способ определить, является ли файл PDF-файлом или нет (легко изменить расширение файла практически для любого файла, создав огромное отверстие для безопасности) ,

Хотя нет ничего в PHP как getimagesize() для PDFs, вы можете проверить тип пантомимы, который является довольно хорошим шагом в этом процессе, как так:

if (!empty($_FILES['fileToUpload']['tmp_name'])) { 
      $finfo = finfo_open(FILEINFO_MIME_TYPE); 
      $mime = finfo_file($finfo, $_FILES['fileToUpload']['tmp_name']); 
      if ($mime != 'application/pdf') { 

       echo 'this is not a PDF file!'; 
       exit(); 
      } 
+0

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

+0

Это может иметь какое-то отношение к нему '$ _FILES ['article_pdf']', если вы его не изменили. @FredericoLopes –

+0

@ Fred-ii- Хорошее место. Я скопировал это с моего собственного кода. Пропущенная переменная – nomistic

0

Спасибо за помощь, после некоторого кода борьба здесь это окончательная функциональная версия:

<?php 

      $target_dir = "extra_images/"; 
      $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); 
      $uploadOk = 1; 
      $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 

      // Check if image file is a actual image or fake image 
      /*if(isset($_POST["submit"])) { 
       $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); 
       if($check !== false) { 
        //echo "<div class=\"alert alert-success\" role=\"alert\"><strong><span class=\"glyphicon glyphicon-ok\" aria-hidden=\"true\"></span> Correct image type.</strong></div>"; 
        $uploadOk = 1; 
       } else { 
        echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>File is not an image.</strong></div>"; 
        $uploadOk = 0; 
       } 
      }*/ 
      // Check if file already exists 
      if (file_exists($target_file)) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>File already exists.</strong></div>"; 
       $uploadOk = 0; 
      } 
      // Check file size 
      if ($_FILES["fileToUpload"]["size"] > 3750000) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>Your file is too large.</strong></div>"; 
       $uploadOk = 0; 
      } 

      // Allow certain file formats 
      /*if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>Only jpg, jpeg, png, gif and pdf (for the Plan Article) files are allowed.</strong></div>"; 
       $uploadOk = 0; 
      }*/ 

      //Check for pdf format 
      if (!empty($_FILES['fileToUpload']['tmp_name'])) { 
       $finfo = finfo_open(FILEINFO_MIME_TYPE); 
       $mime = finfo_file($finfo, $_FILES['fileToUpload']['tmp_name']); 
       if (($mime != 'application/pdf') && ($mime != 'image/jpg') && ($mime != 'image/jpeg') && ($mime != 'image/gif') && ($mime != 'image/png')) { 

        $uploadOk = 0; 
        echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>This file is not a valid file.</strong></div>"; 

        //exit(); 

       }} //this bracket was missing I think 



      // Check if $uploadOk is set to 0 by an error 
      if ($uploadOk == 0) { 
       echo "<div class=\"alert alert-danger\" role=\"alert\"><strong>The file was not uploaded.</strong></div>"; 
      // if everything is ok, try to upload file 
      } else { 
       if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { 

        echo "<div class=\"alert alert-success\" role=\"alert\">The file <strong>". basename($_FILES["fileToUpload"]["name"]). "</strong> has been uploaded.</div><br>Please copy this filename: <span class=\"form-inline\"><input type=\"text\" value=\"". basename($_FILES["fileToUpload"]["name"]). "\" class=\"form-control input-sm\" style=\"width:220px;\" /></span> And paste it in an empty Extra image field above and save the form."; 
       } else { 
        echo "<div class=\"alert alert-danger\" role=\"alert\">There was an error uploading your file.</div>"; 
       } 
      } 
      echo "</br></br><p><button class=\"btn btn-default pull-right\" style=\"margin-right:5px;\" type=\"submit\" onclick=\"javascript:history.go(-1)\"><span class=\"glyphicon glyphicon-step-backward\" aria-hidden=\"true\"></span> Back</button></p>"; 

?> 

что касается & &/|| вопрос, сначала я также имел идею использования || оператор, я попробовал, и это не сработало, возможно, потому что мы используем! = для сравнения, поэтому, если какой-то файл не является jpg, NOT pdf ... и так далее, он не разрешен и получает сообщение об ошибке, а & uploadOK = 0, поэтому не загружайте.

Глядя на код этого является то, что написано, но все-таки идет вразрез с моей логикой :)

большое спасибо за помощь;)

+0

Хорошая работа.Одна вещь, на которой сайт w3schools (это хорошее место для начала) не распространяется, - это недостатки безопасности в самой php. PHP слабо типизирован, что означает, что он продолжает работать в фоновом режиме после многих ошибок (особенно тех мягких ошибок, которые вы видите как «уведомление» или «предупреждение»). Я считаю, что неплохо убить скрипт в любой точке ошибки с помощью 'exit();' на всякий случай. Я рекомендую посмотреть на это: https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet – nomistic

+0

Спасибо! Раньше я знал Паскаль :) и C. Но эти языки, такие как Java и PHP, оставляют меня немного смущенными, так много вещей, чтобы иметь в виду, что я редко могу решить вещи самостоятельно, но это становится лучше;) Как вы думаете, я могу убить сценарий в конце, перед закрывающим тегом php? этот скрипт будет работать внутри iframe, поэтому идея состоит в том, чтобы его можно было загружать столько же, сколько пользователь хочет. –

+0

Я имею в виду только после ошибок: '$ uploadOk = 0;' Это личное предпочтение, но мне обычно нравится генерировать ошибку, а затем просто останавливать скрипт с помощью 'exit(); не знаю, какая разница (я не туз, все еще учась здесь сам), но это заставляет меня чувствовать себя более безопасным. Если кому-то нужно загрузить больше файлов, сценарий может начать снова. – nomistic