web-dev-qa-db-fra.com

Télécharger DOC ou PDF en utilisant PHP

Je peux télécharger des images sans problème, mais lorsque je change les types image/jpg, image/gif en application/msword et application/pdf, cela ne fonctionne pas. Voici mon code. Le même code fonctionne pour les images, mais pour le téléchargement de documents et de PDF, il génère "Fichier non valide". Que se passe t-il ici? Mon fichier ne fait qu'environ 30 Ko et se situe bien en dessous de la limite de taille du fichier.

$allowedExts = array("pdf", "doc", "docx"); 
$extension = end(explode(".", $_FILES["file"]["name"]));

if ( ( ($_FILES["file"]["type"] == "application/msword") || ($_FILES["file"]["type"] == "text/pdf") ) 
&& ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts))
{      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
}
else
{
echo "Invalid file."
}
17
user961627

N'utilisez pas le paramètre ['type'] pour valider les téléchargements. Ce champ est fourni par l'utilisateur et peut être falsifié de manière triviale, ce qui permet de TOUT type de fichier à télécharger. Il en va de même pour le paramètre ['name'] - c'est le nom du fichier tel que fourni par l'utilisateur. Il est également facile de forger, de sorte que l'utilisateur envoie nastyvirus.exe et l'appelle cutekittens.jpg.

La méthode appropriée pour valider les téléchargements consiste à utiliser la détermination du type mime côté serveur, par exemple. via fileinfo , en plus d’une vérification correcte de la réussite du téléchargement, ce que vous ne faites pas:

if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    die("Upload failed with error " . $_FILES['file']['error']);
}
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$ok = false;
switch ($mime) {
   case 'image/jpeg':
   case 'application/pdf'
   case etc....
        $ok = true;
   default:
       die("Unknown/not permitted file type");
}
move_uploaded_file(...);

Vous utilisez également le nom de fichier fourni par l'utilisateur dans la destination finale des fichiers move_uploaded_files. il est également trivial d'intégrer les données de chemin d'accès à ce nom de fichier, que vous utilisez ensuite à l'aveuglette. Cela signifie qu'un utilisateur distant malicieux peut gribouiller sur TOUT fichier sur votre serveur pour lequel il connaît le chemin, en plus de planter de nouveaux fichiers.

34
Marc B

Veuillez ajouter les types de mime corrects à votre code - au moins ceux-ci:

.jpeg -> image/jpeg
.gif  -> image/gif
.png  -> image/png

Une liste des types de mime peut être trouvée ici .

En outre, simplifiez la logique du code et signalez un numéro d'erreur pour aider le support de premier niveau à détecter les problèmes:

$allowedExts = array(
  "pdf", 
  "doc", 
  "docx"
); 

$allowedMimeTypes = array( 
  'application/msword',
  'text/pdf',
  'image/gif',
  'image/jpeg',
  'image/png'
);

$extension = end(explode(".", $_FILES["file"]["name"]));

if ( 20000 < $_FILES["file"]["size"]  ) {
  die( 'Please provide a smaller file [E/1].' );
}

if ( ! ( in_array($extension, $allowedExts ) ) ) {
  die('Please provide another file type [E/2].');
}

if ( in_array( $_FILES["file"]["type"], $allowedMimeTypes ) ) 
{      
 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); 
}
else
{
die('Please provide another file type [E/3].');
}
7
SteAp
$folder = "Resume/";
$temp = explode(".", $_FILES["uploaded"]["name"]);
$newfilename = round(microtime(true)).'.'. end($temp);
$db_path ="$folder".$newfilename  ;
//remove the .
$listtype = array(
'.doc'=>'application/msword',
'.docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'.rtf'=>'application/rtf',
'.pdf'=>'application/pdf'); 
if ( is_uploaded_file( $_FILES['uploaded']['tmp_name'] ) )
{
if($key = array_search($_FILES['uploaded']['type'],$listtype))
{if (move_uploaded_file($_FILES['uploaded']  ['tmp_name'],"$folder".$newfilename))
{
include('connection.php');
$sql ="INSERT INTO tb_upload
(filePath) VALUES ('$db_path')";
}
}
else    
{
echo "File Type Should Be .Docx or .Pdf or .Rtf Or .Doc";
}
5
Deepak Kr

Une de vos conditions échoue. Vérifiez la valeur de type mime pour vos fichiers.
Essayez d'utiliser application/pdf et non text/pdf. Reportez-vous à Type de support MIME approprié pour les fichiers PDF

2
Anirudh Ramanathan

Vous pouvez utiliser 

$_FILES['filename']['error'];

Si n'importe quel type d'erreur se produit, alors il renvoie "erreur" sinon 1,2,3,4 ou 1 si c'est fait 

1: si la taille du fichier est supérieure à la limite .... Vous pouvez trouver d'autres options en googlant

1
Amit
    <?php

    //create table

    /*

    --
    -- Database: `mydb`
    --

    -- --------------------------------------------------------

    --
    -- Table structure for table `tbl_user_data`
    --

    CREATE TABLE `tbl_user_data` (
      `attachment_id` int(11) NOT NULL,
      `attachment` varchar(200) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    --
    -- Indexes for dumped tables
    --

    --
    -- Indexes for table `tbl_user_data`
    --
    ALTER TABLE `tbl_user_data`
      ADD PRIMARY KEY (`attachment_id`);

    --
    -- AUTO_INCREMENT for dumped tables
    --

    --
    -- AUTO_INCREMENT for table `tbl_user_data`
    --
    ALTER TABLE `tbl_user_data`
      MODIFY `attachment_id` int(11) NOT NULL AUTO_INCREMENT;

      */
    $servername = "localhost";
    $username = "root";
    $password = "";
    // Create connection
    $dbname = "myDB";
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    if(isset($_POST['submit'])){

      $fileName=$_FILES["resume"]["name"];
      $fileSize=$_FILES["resume"]["size"]/1024;
      $fileType=$_FILES["resume"]["type"];
      $fileTmpName=$_FILES["resume"]["tmp_name"];
      $statusMsg = '';
      $random=Rand(1111,9999);
      $newFileName=$random.$fileName;

      //file upload path
      $targetDir = "resumeUpload/";
      $fileName = basename($_FILES["resume"]["name"]);
      $targetFilePath = $targetDir . $newFileName;
      $fileType = pathinfo($targetFilePath,PATHINFO_EXTENSION);

      if(!empty($_FILES["resume"]["name"])) {
          //allow certain file formats
          //$allowTypes = array('jpg','png','jpeg','gif','pdf','docx','doc');
          $allowTypes = array('pdf','docx','doc');
          if(in_array($fileType, $allowTypes)){
              //upload file to server
              if(move_uploaded_file($_FILES["resume"]["tmp_name"], $targetFilePath)){
                  $statusMsg = "The file ".$fileName. " has been uploaded.";
              }else{
                  $statusMsg = "Sorry, there was an error uploading your file.";
              }
          }else{
              $statusMsg = 'Sorry, only DOC,DOCX, & PDF files are allowed to upload.';
          }
      }else{
          $statusMsg = 'Please select a file to upload.';
      }

      //display status message
      echo $statusMsg;

      $sql="INSERT INTO `tbl_user_data` (`attachment_id`, `attachment`) VALUES
      ('NULL', '$newFileName')";

      if (mysqli_query($conn, $sql)) {

       $last_id = mysqli_insert_id($conn);
         echo "upload success";
      } else {
          echo "Error: " . $sql . "<br>" . mysqli_error($conn);
      }


    }

    ?>
    <form id="frm_upload" action="" method="post" enctype="multipart/form-data">
    Upload Resume:<input type="file" name="resume" id="resume">
    <button type="submit" name="submit">Apply  Now</button> 
    </form>

     //output sample[![check here for sample output][1]][1]
0
Bhaskar Reddy