Я видел много примеров, но я не уверен, как он может привязываться к сценарию загрузки, который у меня есть. Может кто-нибудь объяснить, как я могу использовать ImageMagick или что-то подобное, чтобы изменить размер загруженного изображения на фиксированную ширину, сохраняя соотношение w: h?
Я googled и посмотрел на более чем 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."; } }
Спасибо 🙂
Вместо move_uploaded_file () вы загрузите файл в библиотеку обработки изображений, измените его размер и сохраните.
например. используя GD, начинайте с imagecreatefromgif (), imagecreatefromjpeg () или imagecreatefrompng () (в зависимости от того, какой формат у вас есть), затем создайте новое изображение желаемого размера эскиза с помощью imagecreatetruecolor () и измените его первоначальное изображение с помощью imagecopyresampled (). Наконец, сохраните результаты, используя imagegif () / imagejpeg () / imagepng () в зависимости от того, какой формат вы хотите.
Определение размера цели довольно просто, если вы просто хотите фиксированную ширину, сохраняя соотношение сторон: new_height = round_to_whole_pixels (new_width * original_height / original_width). Однако стоит поместить некоторые проверки здравомыслия в: скажем, кто-то загружает изображение размером 1×2000 пикселей. Стремясь к ширине (скажем) 200 пикселей, вы должны взорвать ее до 200×400000, огромное изображение, которое может съесть всю память вашего сервера! Так что у вас есть max_height.
Наконец, ваш сценарий в его нынешнем виде содержит слишком много серьезных дыр в безопасности, чтобы их перечислить. Прежде чем вы разместите что-либо подобное в общедоступном Интернете, вам нужно узнать об атаках обхода каталога, SQL-инъекциях, инъекциях HTML (XSS) и уязвимостях при загрузке типов файлов (например, встраивание JavaScript в HTML, замаскированное под изображение).
ETA:
Как вы думаете, этот веб-сайт охватывает большинство баз?
Не совсем, но это начало. Этот совет:
Когда вы размещаете любые загруженные файлы в своей папке загрузки, переименуйте файл в некоторые случайные имена и отслеживайте имя файла в базе данных.
очень важно. Вы никогда не сможете доверять имени файла, представленному пользователем. Имена файлов сложнее, чем вы думаете, и даже если они не пытаются быть злонамеренными, существует много странных способов, по которым имена файлов могут пойти не так:
некоторые браузеры представляют файл-имена, некоторые целые пути, и вы не знаете формат файловых путей на клиентской машине (разделители каталогов на разных платформах включают «/», «\», «:», «.» и, возможно, другие) ,
что произойдет, если указанные имена файлов содержат запрещенные символы? Управляющие символы? Unicode символы?
если вы находитесь на сервере Windows, попробуйте создать файлы с безобидными, но зарезервированными именами, такими как «com», и вы придете обрезку. Кроме того, Windows молча отбрасывает конечные пробелы и точки таким образом, что вы можете легко путать ваши сценарии.
Последнее является потенциальной дырой безопасности в скрипте, который вы связали. Он проверяет наличие «плохих» расширений файлов, таких как «.php» в конце имени файла. Но если вы загрузили файл с именем «x.php» (с пробелом) на сервер Windows, он с радостью примет его и сохранит его как «x.php». (В скрипте также есть ошибка, так как она использует «.» В регулярном выражении, которое обозначает любой символ. Таким образом, имя файла «poo.potatophp» будет считаться имеющим расширение .php.)
Как обычно, белый список лучше черного списка. Разрешить только, например. Расширения «.jpeg» с большей вероятностью работают, чем отказ от известных – плохих. Однако этого все еще недостаточно, потому что нет гарантии, что в представленном файле JPEG на самом деле будет расширение «.jpeg». В Windows у него может быть расширение «.jpg» или «.pjpeg» или что-то еще, что, возможно, отображается на JPEG на клиентской машине. На Mac или Linux у него может не быть расширения имени файла вообще!
Итак, чтобы подвести итог: лучше всего игнорировать любое имя файла / путь, отправленный с полями загрузки файлов. Возможно, вы можете взглянуть на него, чтобы угадать, в каком формате может находиться файл, если вы еще этого не знаете, но вы не можете полагаться на него, и вы никогда не должны использовать слово пользователя для него и фактически сохранять его под этим имя.
На странице также не рассматривается случай «HTML, замаскированный под изображение», о котором я упоминал. Если вы разрешаете кому-либо загружать файлы, на которые вы полностью не доверяете, с полным доступом ко всему на своем сайте, вам нужно беспокоиться об этом. Вы можете прочитать об этом здесь . Подробнее об обсуждении сценариев загрузки файлов PHP см . Здесь .
ETA2:
Я видел много предложений по загрузке выше веб-каталога. Тем не менее мой скрипт будет показывать эти файлы посетителям веб-сайта.
Да, это хорошее место для начала. Управляя процессом обслуживания в своих руках, вы избегаете каких-либо проблем с веб-сервером, который обрабатывает типы файлов неожиданным образом, вы можете использовать свои собственные безопасные имена файлов и, добавив в свой скрипт заголовок Content-Disposition: attachment, вы можете в основном запретить браузерам рассматривать активный контент, такой как JavaScript, исходя из контекста безопасности вашего сайта, вызывая проблемы с межсайтовыми сценариями.
Недостатком этого метода является то, что обслуживание файла через PHP намного, намного медленнее, чем позволить веб-серверу делать это. Вы можете улучшить ситуацию, внедряя загрузку заголовков HTTP-кеширования в скрипт для работы с файлами, но это большая работа, и она все равно будет не так быстро, как обычный веб-сервер, написанный на C, и, возможно, с использованием сети уровня ядра эффективность взлома. Для файла, который вы обслуживаете иногда, это не проблема. Для того, чтобы популярное изображение просматривалось все время на загруженном сайте, это не годится.
Кроме того, были некоторые проблемы, в которых Flash игнорировал заголовок Content-Disposition, который по-прежнему мог бы подталкивать файлы XSS через этот плагин. Теперь они исправлены, но кто знает, какие другие плагины и поведение нечетного браузера могут быть там. Поэтому для обеспечения безопасности лучше всего обслуживать ваши ненадежные загруженные пользователем файлы с другого имени хоста, например. субдомен, такой как data.example.com. Это предотвращает утечку файлов cookie и проверки подлинности в двух контекстах безопасности. Если вы идете на способ выплескивания файлов на основе веб-сервера, вам обязательно нужно принять эту меру предосторожности.
Я просто хочу сделать это, слишком сложно
Да, это выглядит как обманчиво простая задача, но на самом деле это не так. Некоторые очень громкие веб-сайты пострадали от проблем с безопасностью из-за ненадежных загрузок; если Microsoft и веб-пользователи Google не всегда могут это исправить, возможно, это довольно сложно …
Это не помогает (как обычно для PHP). 99% учебных пособий, охватывающих такие вещи, являются полным дерьмом.
list($originalWidth, $originalHeight) = getimagesize($originalFile); $width = 250; // whatever your fixed width is $height = ceil(($width / $originalWidth) * $originalHeight);
Затем следуйте инструкциям bob
// 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);
Комментарии в изобилии! Это примерно тот код, который я использую для создания эскизов в собственной галерее. Единственная проблема, которую я вижу, – это то, что вам нужно, чтобы миниатюры были чем-то иным, чем квадраты в их максимальных размерах, так как этот код ограничивает только квадрат.