it-swarm.com.de

Hochladen DOC oder PDF mit PHP

Ich kann Bilder gut hochladen, aber wenn ich die Typen von image/jpg, image/gif in application/msword und application/pdf ändere, funktioniert das nicht. Hier ist mein Code. Der gleiche Code funktioniert für Bilder, aber für das Hochladen von Dokumenten und PDFs wird "Ungültige Datei" ausgegeben. Was ist denn hier los? Meine Datei ist nur ca. 30kb groß und liegt hier weit unterhalb der Dateigrößenbegrenzung.

$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

Verwenden Sie den ['type']-Parameter nicht zum Überprüfen von Uploads. Dieses Feld wird vom Benutzer bereitgestellt und kann auf einfache Weise gefälscht werden, sodass ein beliebiger Dateityp hochgeladen werden kann. Dasselbe gilt für den ['name']-Parameter. Dies ist der Name der Datei, wie vom Benutzer angegeben. Das Schmieden ist auch trivial, so dass der Benutzer nastyvirus.exe sendet und cutekittens.jpg anruft.

Die richtige Methode zum Validieren von Uploads ist die serverseitige Bestimmung des Mime-Typs, z. via fileinfo , plus Überprüfung des Upload-Erfolgs, was Sie nicht tun:

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(...);

Sie verwenden auch den vom Benutzer bereitgestellten Dateinamen als Teil des Endziels der Datei move_uploaded_files. Es ist auch trivial, Pfaddaten in diesen Dateinamen einzubetten, den Sie dann blind verwenden. Das bedeutet, dass ein böswilliger Remotebenutzer auf JEDE Datei auf Ihrem Server kritzeln kann, für die er den Pfad kennt, und neue Dateien anlegen.

34
Marc B

Bitte fügen Sie Ihrem Code die richtigen Mime-Typen hinzu - zumindest diese:

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

Eine Liste der Mime-Typen finden Sie hier .

Vereinfachen Sie außerdem die Logik des Codes und geben Sie eine Fehlernummer an, um der ersten Ebene zu helfen, Probleme aufzuspüren:

$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

Eine Ihrer Bedingungen versagt. Überprüfen Sie den Wert des Mime-Typs für Ihre Dateien.
Versuchen Sie es mit application/pdf, nicht mit text/pdf. Siehe Richtiger MIME-Medientyp für PDF -Dateien

2

Sie können verwenden 

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

Wenn irgendein Fehler auftritt, wird 'error' zurückgegeben, andernfalls 1,2,3,4 oder 1, wenn dies der Fall ist 

1: Wenn die Dateigröße überschritten wird ... Sie können andere Optionen finden, indem Sie googeln

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