Я занимаюсь созданием сайта для продвижения событий в PHP и MySQL в течение последних нескольких месяцев, где каждый может зарегистрироваться и добавить данные локального события вместе с плакатом, который я изменяю.Загрузка изображения с помощью PHP
Как бы то ни было, у меня есть весь процесс, работающий нормально и на хостинге, но до того, как сайт выходит в эфир, у меня есть пара вопросов о том, как я это делаю.
Это код функции, которую я использую для обработки изображений. Я проверяю размер файла перед этим разделом.
$extension = substr($filename, strpos($filename,'.'), strlen($filename)-1);
$filetypes = array('.jpg', '.jpeg', '.gif', '.bmp', '.png', '.JPG', '.PNG', '.JPEG', '.GIF', '.BMP');
if($_FILES['image']['error'] == 4){
$error = "No image";
return $error;
}
else if(($_FILES['image']['error'] == 2) || ($_FILES['image']['error'] == 1)){
$error = "File size too big";
return $error;
}
else if(!in_array($extension, $filetypes)){
$error = "This isn't an image that is supported";
return $error;
}
else if(($_FILES['image']['error'] == 7) || ($_FILES['image']['error'] == 3)){
$error = "Error occurred. Try again";
return $error;
}
else{
if(($extension == '.jpg') || ($extension == '.jpeg')){
$source = imagecreatefromjpeg($uploaded);
}
else if($extension == '.png'){
$source = imagecreatefrompng($uploaded);
}
else{
$source = imagecreatefromgif($uploaded);
}
list($width, $height) = getimagesize($uploaded);
$ratio = $width/$height;
$new_width = 300;
$new_height = round(300/$ratio);
$canvas = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($canvas, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
$name = date("dmyHis").rand(0, 9);
$path = $_SERVER[ 'DOCUMENT_ROOT' ] . '/images/uploaded/'.$name.'.jpg';
$new_image = imagejpeg($canvas, $path, 100);
$poster['name'] = $name.'.jpg';
$poster['width'] = $new_width;
$poster['height'] = $new_height;
return $name.'.jpg';
}
Как он стоит, есть несколько ошибок, которые я знаю об этом, или не полностью смотрели в, например, некоторые изображения метательных ошибку из imagecreatefromwhatever, и если имя изображения есть «» в нем он также выдает ошибку.
Как только процесс будет завершен, я сохраню имя изображения в поле «плакат» в MySQL, которое будет использоваться для получения правильного изображения из папки при просмотре.
Что я действительно хотел знать, есть ли какие-либо другие проблемы, с которыми я, вероятно, столкнулся с загрузкой изображений?
- Я ожидаю достаточного количества трафика, так будет ли этот код работать с большим использованием?
- Есть ли другие подводные камни или вещи, которые я должен искать?
- Я использую лучший метод для работы?
- Ограничение размера файла на данный момент составляет 2 МБ, это слишком высокое?
- Даже если пользователь загружает что-то более 2 МБ, сценарий все равно будет работать, и я предполагаю, что файл будет загружен на сервер для удаления имен и сравнения файлов и т. Д., Как это повлияет на использование моей полосы пропускания?
- Как долго постоянные файлы остаются на сервере?
Если у кого-то есть хорошие чтения по этому вопросу, я был бы очень признателен!
спасибо.
Редактировать: Форматирование.
Редактировать 2: Я не уточнил исходные файлы. Я имею в виду исходные файлы, к которым я использую переменную $ _FILES для доступа. Скажем, что это 1,9 МБ, будет ли изображение на 1,9 МБ на сервере все время, когда я буду заниматься расширением и тем? Должен ли я очистить это, как только я создал новое изображение?
Я не считал, что имя файла может быть плохим. Спасибо за подсказку по getimagesize. Что касается каналов изображения, я понятия не имел, что CYMK вызовет проблемы. Очень полезная информация, спасибо! – chudley
Хорошая точка в файле. Смешная причуда php заключается в том, что вы можете сказать 'imagecreatefromstring()', и тогда вам не нужно знать тип - довольно странный, но истинный. Таким образом, вы можете загрузить изображение, используя '$ imagedata = file_get_contents ($ filename);'. (обратите внимание, что в средах с общим хостингом, где память может быть ограничена, это будет дополнительно 2 Мб) – mvds