0 votes

J'ai ce téléchargement php cassé script.

J'ai ce script pour télécharger une image et du contenu à partir d'un formulaire, il fonctionne dans un projet mais pas dans l'autre. J'ai passé quelques bonnes heures à essayer de le déboguer, j'espère que quelqu'un pourra m'indiquer le problème que je pourrais avoir. J'espère que quelqu'un pourra m'indiquer le problème que j'ai pu rencontrer. La première erreur que j'ai obtenue était le "echo invalid file" au début du dernier commentaire. Avec ces zones spécifiques commentées, le nom et le type de téléchargement que je suis censé saisir dans le formulaire ne sont pas répercutés. Je pense que c'est là que l'erreur se produit, mais je n'arrive pas à la trouver. Merci.

    <?php
include("../includes/connect.php");
/*
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 2000000))
  {
    */
  if ($_FILES["file"]["error"] > 0) 
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

        /* GRAB FORM DATA */
    $title = $_POST['title'];
    $date = $_POST['date'];
    $content = $_POST['content'];
    $imageName1 = $_FILES["file"]["name"];

    echo $title;
    echo "<br/>";
    echo $date;
    echo "<br/>";
    echo $content;
    echo "<br/>";
    echo $imageName1;

    $sql = "INSERT INTO blog (title,date,content,image)VALUES(
    \"$title\",
    \"$date\",
    \"$content\",
    \"$imageName1\"
    )";

    $results = mysql_query($sql)or die(mysql_error());

    echo "<br/>";

    if (file_exists("../images/blog/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "../images/blog/" . $_FILES["file"]["name"]);
      echo "Stored in: " . "../images/blog/" . $_FILES["file"]["name"];
      }
    }

  /*
  }
else
  {
  echo "Invalid file" . "<br/>";
  echo "Type: " . $_FILES["file"]["type"] . "<br />";
  }
  */

  //lets create a thumbnail of this uploaded image.
  /*
    $fileName = $_FILES["file"]["name"];
    createThumb($fileName,310,"../images/blog/thumbs/");
    function createThumb($thisFileName, $thisThumbWidth, $thisThumbDest){
    $thisOriginalFilePath = "../images/blog/". $thisFileName;
    list($width, $height) = getimagesize($thisOriginalFilePath);
    $imgRatio =$width/$height;
    $thisThumbHeight = $thisThumbWidth/$imgRatio;
    $thumb = imagecreatetruecolor($thisThumbWidth,$thisThumbHeight);
    $source = imagecreatefromjpeg($thisOriginalFilePath);
    imagecopyresampled($thumb, $source, 0, 0, 0, 0, $thisThumbWidth,$thisThumbHeight, $width, $height);
    $newFileName = $thisThumbDest.$thisFileName;
    imagejpeg($thumb,$newFileName, 80);
    echo "<p><img src=\"$newFileName\" /></p>";

    //header("location: http://www.google.ca");

    }

    */

?>

2voto

RC. Points 18567

Vous avez peut-être oublié d'ajouter enctype="multipart/form-data" method="post" à votre formulaire HTML, ou n'avez pas <input type="file" name="file" id="file" value=""/> dans votre HTML.

0voto

Unix Man Points 1481

Essayez d'utiliser n'importe quelle classe de téléchargement, quelque chose comme :

0voto

Cool Guy Yo Points 1590

L'erreur se trouvait dans le fichier de formulaire html, j'avais ajouté un name="quelque chose" à côté de method="post" et enctype="multi/form-data" évidemment cela n'a pas été apprécié. Merci RC de m'avoir indiqué la bonne direction. Je ne sais pas vraiment pourquoi j'ai fait cela.

0voto

Marc B Points 195501

Voici quelques problèmes avec votre script :

  1. La valeur "error" dans le tableau $_FILES n'est pas seulement un booléen, elle vous indique si le téléchargement a réussi ou pourquoi il a échoué. Les codes d'erreur sont définis aquí .

  2. La valeur "type" est fournie par le client distant. Elle n'est PAS déterminée par le serveur web ou PHP. En tant que tel, la vérification du mime-type basée sur cette valeur est une faille majeure : il est trivial de falsifier la valeur du type fournie. Le mieux est d'utiliser une méthode côté serveur, telle que fileinfo pour déterminer le type de mime.

  3. Vous insérez aveuglément les données du formulaire dans votre requête d'insertion, ce qui vous expose à des attaques par injection SQL. Passez au moins les données par mysql_real_escape_string() avant de construire votre requête, ou mieux encore, utilisez AOP et les requêtes paramétrées

  4. Vous stockez les fichiers avec le nom original fourni par le client. Vous vérifiez au moins si le nom de fichier est déjà utilisé, ce qui empêche les collisions/écrasements de téléchargements, mais il y a aussi le cas où le système d'exploitation/système de fichiers du client autorise des caractères dans les noms de fichiers que le système d'exploitation/système de fichiers du serveur n'autorise pas, ce qui pourrait conduire à des bugs subtils de "disparition" de fichiers, ou à l'écrasement de fichiers entièrement différents parce que les caractères invalides ont été filtrés ou traduits en quelque chose d'autre. Puisque vous utilisez une base de données pour stocker les informations sur le téléchargement, vous pouvez stocker le nom de fichier original dans cette table, et utiliser la clé primaire de la table (un int à incrémentation automatique, n'est-ce pas ?) comme nom de fichier.

  5. Ce n'est pas vraiment un problème, mais en termes d'efficacité, il n'est pas nécessaire d'utiliser getimagesize() dans votre fonction de création de pouce. GD a imagesx() y imagesy() qui récupèrent la taille en pixels d'un handle d'image GD. getimagesize() est indépendant de GD, donc vous ouvrez et analysez l'image source deux fois. Encore une fois, ce n'est pas vraiment un problème, mais sur un site très fréquenté, n'ouvrir l'image qu'une seule fois peut représenter une économie de temps de calcul et d'utilisation de la mémoire.

-1voto

$_FILES["file"]["error"] n'est pas seulement un drapeau.
Il a des codes d'erreur.
Expliqué dans le manuel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X