У меня сломан скрипт загрузки php - PullRequest
0 голосов
/ 25 мая 2010

У меня есть этот скрипт для загрузки изображения и контента из формы, он работает в одном проекте, но не в другом. Я потратил много часов, пытаясь его отладить, я надеюсь, что кто-то может указать на проблему, которая может возникнуть. Где есть комментарии, где я пытался отлаживать. Первая ошибка, которую я получил, была «неверный файл эха» в начале последнего комментария. С этими конкретными областями закомментированы имя загрузки и тип, который я должен получить из формы, не отражается, я думаю, что это, где происходит ошибка, но не могу ее найти Спасибо.

    <?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");

    }

    */





?>

Ответы [ 4 ]

2 голосов
/ 25 мая 2010

Возможно, вы забыли добавить enctype="multipart/form-data" method="post" к вашей HTML-форме или у вас нет <input type="file" name="file" id="file" value=""/> в вашем HTML.

0 голосов
/ 25 мая 2010

Вот некоторые проблемы с вашим скриптом:

  1. Значение 'error' в массиве $ _FILES - это не просто логическое значение, оно сообщит вам, была ли загрузка успешной или почему произошла ошибка. Коды ошибок определены здесь .

  2. Значение 'type' предоставляется удаленным клиентом. Это НЕ определяется веб-сервером или PHP. Таким образом, проверка типа MIME на основе этого значения является главной дырой: подделать предоставленное значение типа тривиально. Лучше всего использовать метод на стороне сервера, например fileinfo , для определения фактического типа MIME.

  3. Вы слепо вставляете данные формы в запрос вставки, что делает вас широко открытыми для атак с использованием SQL-инъекций. По крайней мере, перед построением запроса передайте данные через mysql_real_escape_string () или, что еще лучше, используйте PDO и параметризованные запросы

  4. Вы храните файлы с оригинальным именем, предоставленным клиентом. Вы, по крайней мере, проверяете, используется ли уже используемое имя файла, предотвращая коллизии / перезапись при загрузке, но есть также случай, когда операционная система / файловая система клиента допускает символы в именах файлов, которых нет в OS / FS сервера, что может привести к скрытому файлу » исчезли "ошибки или перезаписали совершенно другие файлы, потому что недопустимые символы были отфильтрованы или переведены во что-то другое. Поскольку вы используете базу данных для хранения информации о загрузке, вы можете сохранить исходное имя файла в этой таблице и использовать первичный ключ таблицы (auto_increment int, верно?) В качестве имени файла.

  5. Не совсем проблема, но с точки зрения эффективности, нет необходимости использовать getimagesize () в вашей функции создания большого пальца. GD имеет imagesx () и imagesy () , которые получают размер пикселя из дескриптора изображения GD. getimagesize () не зависит от GD, поэтому вы открываете и анализируете исходное изображение дважды. Опять же, это на самом деле не проблема, но на загруженном сайте открытие изображения только один раз может быть приличной экономией времени и ресурсов процессора.

0 голосов
/ 25 мая 2010

Ошибка была в файле формы html, я добавил имя = "что-то" рядом с методом = "пост" и enctype = "multi / form-data", очевидно, это не понравилось Спасибо RC за то, что указал мне правильное направление. Я не совсем уверен, почему я это сделал.

0 голосов
/ 25 мая 2010

$ _ FILES ["file"] ["error"] - это не просто флаг.
Имеет коды ошибок.
Объясняется в руководстве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...