PHP изменение размера и мой скрипт загрузки

Я видел много примеров, но я не уверен, как это может быть связано с сценарием загрузки, который у меня сейчас есть. Может кто-нибудь объяснить, как я мог бы использовать ImageMagick или что-то в этом роде, чтобы изменить размер загруженного изображения до фиксированной ширины, сохраняя соотношение w: h?

Я погуглил и просмотрел более 150 веб-страниц, но ни одна из них не дает такого примера, который, на мой взгляд, применим к моей ситуации. Любая помощь будет оценена. Вот мой код:

// Include Extension finder function.
include_once 'find_extension.php';

    // Function Gathers the Input Name, Store Number and Picture Number. The picture number is assigned by the loop that will be cycling through the images to be uploaded. The store Number and the Picure Number will make the file name.
    function uploadImage($inputname, $storenum, $picturenum){

// A few parameters, to restrict file types and file size to 20kb.
if ((($_FILES[$inputname]["type"] == "image/gif")
|| ($_FILES[$inputname]["type"] == "image/png") 
|| ($_FILES[$inputname]["type"] == "image/jpeg") 
|| ($_FILES[$inputname]["type"] == "image/pjpeg"))
&& ($_FILES[$inputname]["size"] < 200000))
  {
      // If there is an error, echo the error, if not continue.
    if ($_FILES[$inputname]["error"] > 0){
        echo "Error: " . $_FILES[$inputname]["error"] . "<br>";
    }else{
      // Echo out File information.
 /* echo "Upload: " . $_FILES[$inputname]["name"] . "<br>";
  echo "Type: " . $_FILES[$inputname]["type"] . "<br>";
  echo "Size: " . ($_FILES[$inputname]["size"] / 1024) . " Kb<br>";
  echo "Stored in: " . $_FILES[$inputname]["tmp_name"]; */
    }

    // Get the extension so we can rename using the previous function.
    $ext = findexts($_FILES[$inputname]["name"]);

    $newpicturename = $storenum . $picturenum . "." . $ext;
    // Check to see if the file exists, if it does then tell the user. If not continue.
    if (file_exists("userimages/" . $newpicturename)){

      echo "<br>" . $newpicturename . " already exists. ";

      }else{

    // Uploads the file.
      move_uploaded_file($_FILES[$inputname]["tmp_name"], "userimages/" . $newpicturename);

    $picturefield = "picture" . $picturenum;
    $picturepath = "userimages/" . $newpicturename;
    //Inserts data into ad DB
    mysql_query("UPDATE storead SET $picturefield='$picturepath' WHERE storenum='$storenum'");
    // Tells the User.
     // echo "Stored in: " . "userimages/" . $newpicturename;
      }

  }else{
      // If the upload does not meet the parameters above, then tell the user and cancel.
      echo "Error uploading " . $_FILES[$inputname]["name"] . ". File may be too large or of unnacepted format.";
  }

}

Спасибо :)

Ответы на вопрос(3)

list($originalWidth, $originalHeight) = getimagesize($originalFile);
$width = 250; // whatever your fixed width is
$height = ceil(($width / $originalWidth) * $originalHeight);

// Get the image data.
// This REALLY needs some form of security, doing it like in this example is *bad*.
// There are other functions than "imagecreatefromjpeg" to handle other formats.
$image = imagecreatefromjpeg($_FILES["userfile"]["tmp_name"]);

// Get image dimensions.
$imgX = imagesx($image);
$imgY = imagesy($image);

// Get aspect ratio.
// Biggest dimension is what we will use to constrain the thumbnail.
if($imgX > $imgY) {
    $multiplier = 150 / $imgX;
} else {
    $multiplier = 150 / $imgY;
}

// Create a scaled down version of the uploaded image.
$thumb = imagecreatetruecolor($imgX * $multiplier, $imgY * $multiplier);
imagecopyresampled($thumb, $image, 0,0,0,0, $imgX * $multiplier, $imgY * $multiplier, $imgX, $imgY);

который я использую для создания миниатюр в моей собственной галерее. Единственная проблема, которую я вижу, - если вам нужно, чтобы миниатюры были чем-то отличным от квадратов в их максимальных размерах, так как этот код ограничивается только квадратом.

 Chris Bier24 авг. 2009 г., 00:00
Что я делаю из imagecopyresampled? Вот где я заблудился. это обратно в темп? Должен ли я просто продолжать загружать файл как обычно? Спасибо!
 grimman24 авг. 2009 г., 10:09
php.net/imagecopyresampled  В основном мы помещаем измененное содержимое $ image в $ thumb.
Решение Вопроса

d загрузить файл в библиотеку обработки изображений, изменить его размер и сохранить.

например. используя GD, начните с imagecreatefromgif (), imagecreatefromjpeg () или imagecreatefrompng () (в зависимости от того, какой формат вы), затем создайте новое изображение нужного размера миниатюры с помощью imagecreatetruecolor () и измените размер исходного изображения в нем с помощью imagecopyresampled (). Наконец сохраните результаты, используя imagegif () / imagejpeg () / imagepng () в зависимости от того, какой формат вы хотите.

Определить целевой размер довольно легко, если вы просто хотите иметь фиксированную ширину, сохраняя при этом соотношение сторон: new_height = round_to_whole_pixels (new_width * original_height / original_width). Тем не менее, стоит добавить некоторые проверки работоспособности: скажем, кто-то загружает изображение размером 1x2000 пикселей. Нацелившись на ширину (скажем) 200 пикселей, вызатем увеличу его до 200х400000, огромное изображение, которое может съесть весь ваш сервер.с памятью! Так что имейте также max_height.

Наконец, ваш скрипт в его нынешнем виде содержит слишком много серьезных брешей в безопасности. Прежде чем размещать что-либо подобное в общедоступном Интернете, вам необходимо узнать об атаках обхода каталогов, внедрении SQL, внедрении HTML (XSS) и уязвимостях, приводящих к перехвату типов загрузки файлов (например, встраивание JavaScript в HTML, замаскированный под файл изображения).

ETA:

Как вы думаете, этот веб-сайт охватывает большинство баз?

Не совсем, но этоэто начало. Этот совет:

Когда вы помещаете какие-либо загруженные файлы в папку загрузки, переименовывайте файл в несколько случайных имен и отслеживайте имя файла в базе данных.

очень важно. Вы никогда не можете доверять имени файла, представленному пользователем. Имена файлов сложнее, чем вы думаете, и даже если ониНе пытаясь быть злонамеренным, существует множество странных причин, по которым имена файлов могут быть неправильными:

некоторые браузеры отправляют имена файлов, некоторые пути, и вы нене знает формат файловых путей на клиентском компьютере (разделители каталогов на различных платформах включают в себя «/», «\», «:», «.» и, вероятно, другие).

какие'произойдет, если указанные имена файлов содержат запрещенные символы? Управляющие персонажи? Символы юникода?

если ты'на сервере Windows попробуйте создать файлы с безобидными, но зарезервированными именами, такими как ‘ком» и ты'Приду кроппер. Кроме того, Windows молча отбрасывает конечные пробелы и точки таким образом, чтобы легко запутать ваши сценарии.

Последнее является потенциальной дырой в безопасности в сценарии, который вы связали. Это проверяет на ‘плохой' Расширения файлов, такие как ‘.php» в конце имени файла. Но если вы загрузили файл с именем ‘x.php ’ (с пробелом) на сервер Windows, он с радостью примет его и сохранит как ‘x.php», (В скрипте также есть ошибка, так как он использует «.» в регулярном выражении, которое обозначает любой символ. Итак, имя файла ‘poo.potatophp» будет рассматриваться как расширение .php.)

Как обычно, белый список лучше, чем черный. Разрешить только напр. «.jpeg» расширения, скорее всего, сработают, чем запретят известные плохие. Однако этого по-прежнему недостаточно, поскольку нет гарантии, что представленный файл JPEG будет иметь расширение ‘.jpeg», В Windows это может иметь расширение ‘.jpg» или же '.pjpeg» или что-то еще, полностью сопоставленное с JPEG на клиентском компьютере. На Mac или Linux он может вообще не иметь расширения имени файла!

Итак, подведем итог: лучше всего игнорировать любое имя файла / путь, указанный в полях загрузки файла. Может быть, вы можете взглянуть на него, чтобы угадать, в каком формате может быть файл, если вы неуже знаю, но ты не можешьне полагайтесь на это, и вы никогда не должны брать пользователяСлово для этого и на самом деле сохранить его под этим именем.

Страница также не покрывает ‘HTML, замаскированный под файл изображения Случай, который я упомянул. Если вы позволите кому-либо загружать файлы, которые вы неВы не должны полностью доверять, предоставляя полный доступ ко всему на своем сайте. Вы можете прочитать об этомВот, Смотрите более подробное обсуждение рисков сценария загрузки файлов PHPВот.

ETA2:

Я видел много предложений по загрузке над веб-каталогом. Тем не менее, мой скрипт все равно будет отображать эти файлы посетителям сайта.

Да, этоХорошее место для начала. Взяв под свой контроль процесс обслуживания в свои руки, вы избежите любых проблем с веб-сервером, обрабатывающих типы файлов неожиданными способами, вы можете использовать свои собственные известные безопасные имена файлов, а также добавив в свой скрипт «Content-Disposition: приложение » заголовок, вы в основном можете запретить браузерам воспринимать активный контент, такой как JavaScript, как исходящий от вашего сайта.контекст безопасности, вызывающий проблемы межсайтового скриптинга.

Недостатком этого метода является то, что обслуживание файла через PHP очень много,много медленнее, чем позволить веб-серверу сделать это. Вы можете улучшить ситуацию, внедрив в свой файл-сценарий загрузку заголовков кэширования HTTP, но этомного работы, и она все еще выигрываетон не может быть таким же быстрым, как типичный веб-сервер, написанный на C, и, возможно, использует хаки эффективности сети на уровне ядра. Для файла, который вы иногда подаете, этоНет проблем. Для популярного изображения, постоянно просматриваемого на загруженном сайте,ничего хорошего нет.

Кроме того, раньше были некоторые проблемы, когда Flash игнорировал заголовок Content-Disposition, что могло привести к скрытым файлам в XSS через этот плагин. Они исправлены, но кто знает, какие еще плагины и странное поведение браузера могут быть там. Так что для безопасности может быть лучше обслуживать ваши ненадежные загруженные пользователем файлы с другого имени хоста, например. субдомен, такой как data.example.com. Это предотвращает утечку файлов cookie и сведений об аутентификации в двух контекстах безопасности. Если вы выбираете способ выкладывания файлов на основе веб-сервера, вам определенно необходимо принять эту меру предосторожности.

Я просто хочу сделать это, это слишком сложно

Да, это выглядит обманчиво простой задачей, но этона самом деле нет. Некоторые очень громкие веб-сайты страдают проблемами безопасности из-за ненадежных загрузок; если Microsoft и Google 'с веб парни могутэто всегда правильно, наверноеявляется довольно сложный...

Это неЭто не поможет (как обычно для PHP), 99% уроков, посвященных подобным вещам, - полная чушь.

 bobince21 авг. 2009 г., 21:24
[добавлено больше губбин]
 Chris Bier21 авг. 2009 г., 20:08
Эндрю, я ищу простой способ сделать это, и я видел много предложений по загрузке над веб-каталогом. Тем не менее, мой скрипт все равно будет отображать эти файлы посетителям сайта. В сочетании с надежным белым списком, вы думаете, что это безопасный маршрут? и возможен ли такой вид белого списка? Я просто хочу сделать это, это слишком сложно, смеется. Спасибо!!
 dcousineau21 авг. 2009 г., 21:27
Крис Б .: Надежная часть вашей работы - убедиться, что файлвы собираетесь загрузить это загруженный файл, и вымы проверили типы пантомимы. Но, честно говоря, все, что вам действительно нужно сделать, это наблюдать за функциями gd при открытии изображения. Если БД задохнется от изображения, это неt правильное изображение, поэтому удалите его.
 Chris Bier24 авг. 2009 г., 00:52
Андрей, спасибо за ваш вклад, это очень ценится. И да, есть много дрянных обучающих программ для этого онлайн. Еще одна проблема - загрузка и изменение размера изображения. Я хочу принять ваш ответ, потому что это большая помощь, но в то же время мне все еще нужно решить эту проблему.
 Chris Bier20 авг. 2009 г., 04:33
Как вы думаете, этот веб-сайт охватывает большинство баз?mysql-apache-php.com/fileupload-security.htm
 Chris Bier20 авг. 2009 г., 04:17
Спасибо, Боб, у тебя есть хорошие ресурсы для безопасной загрузки изображений?

Ваш ответ на вопрос