Одной из распространенных задач при разработке того или иного проекта является загрузка изображений на сайт, это могут быть фотографии в альбомы, рисунки в статьи или банальные аватарки пользователей. Давайте же решим эту задачу.
I. Проектирование базы данных
Нам понадобится две таблицы — это users и user_uploads, в первой будем хранить информацию о пользователях (id, username, password и т.д.), во вторую же будем записывать информацию о загруженных изображениях.
CREATE TABLE `users` (
`user_id` int(11) AUTO_INCREMENT PRIMARY KEY,
`username` varchar(255) UNIQUE KEY,
`password` varchar(100),
`email` varchar(255) UNIQUE KEY
)
CREATE TABLE `user_uploads` (
`upload_id` int(11) AUTO_INCREMENT PRIMARY KEY,
`image_name` text,
`user_id_fk` int(11),
`created` int(11)
)
II. Код Javascript (jQuery)
Добавим обработку формы загрузки изображений, основную задачу будет выполнять jquery.wallform.js, для работы которого нам необходимо подключить jQuery. После выбора нужных картинок срабатывает функция $("#photoimg").change(function(){}), где "photoimg" — идентификатор поля типа "file". Данная функция как раз вызывает .ajaxForm(), которая и выполняет ajax — отправку файлов на сервер. Результат выводится в блок с ID: "preview".
<script type="text/javascript" src="jquery.wallform.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#photoimg").change(function() {
var A = $("#imageloadstatus");
var B = $("#imageloadbutton");
$("#imageform").ajaxForm({
target: '#preview',
beforeSubmit:function() {
A.show();
B.hide();
},
success:function(){
A.hide();
B.show();
},
error:function(){
A.hide();
B.show();
}
}).submit();
});
});
</script>
III. PHP обработка
PHP обработка состоит из трех пунктов(файлов) — это конфиг и подключение к базе данных, генерация формы и загрузки файлов на сервер.
1) db.php — подключение к базе данных;
<?php
$mysql_hostname = "localhost";
$mysql_user = "username";
$mysql_password = "password";
$mysql_database = "database";
$prefix = "";
$dbh = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password, $mysql_database);
?>
2) index.php — создание формы
<?php
session_start();
$session_id = '1'; /* Создание сессии */
?>
<div id='preview'></div>
<form id="imageform" method="post" enctype="multipart/form-data" action='ajaxImageUpload.php' style="clear:both">
Загрузка картинок:
<div id='imageloadstatus' style='display:none'><img src="loader.gif" alt="Загрузка ...."/></div>
<div id='imageloadbutton'>
<input type="file" name="photos[]" id="photoimg" multiple="true" />
</div>
</form>
3) ajaxImageUpload.php — обработка формы, загрузка изображений на сервер
<?php
error_reporting(0); /* Отключаем вывод ошибок */
require_once 'db.php';
session_start();
$session_id = '1';
define ("MAX_SIZE","2000"); /* 2MB максимальный размер загружаемого файла */
function getExtension($str) { /* Определяем формат файла */
$i = strrpos($str,".");
if(!$i) { return ""; }
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}
/* Разрешенные форматы для файлов, при желании можно добавить свои */
$valid_formats = array("jpg", "png", "gif", "bmp","jpeg");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST") {
$uploaddir = "uploads/"; /* Папка для загрузки изображений */
foreach ($_FILES['photos']['name'] as $name => $value) {
$filename = stripslashes($_FILES['photos']['name'][$name]);
$size = filesize($_FILES['photos']['tmp_name'][$name]);
$ext = getExtension($filename);
$ext = strtolower($ext);
if(in_array($ext,$valid_formats)) {
/* Проверка размера файла */
if($size < (MAX_SIZE*1024)) {
$image_name=time().$filename;
echo "<img src='".$uploaddir.$image_name."' class='imgList'>";
$newname=$uploaddir.$image_name;
/* Сохраняем файл */
if(move_uploaded_file($_FILES['photos']['tmp_name'][$name], $newname)) {
$time=time();
/* Добавляем инфомацию в базу */
mysqli_query($dbh, "INSERT INTO user_uploads(image_name, user_id_fk, created) VALUES('{$image_name}', '{$session_id}', '{$time}')");
} else {
echo '<span class="imgList">Ошибка! Файл слишком велик!</span>';
}
} else {
echo '<span class="imgList">Ошибка! Файл слишком велик!</span>';
}
} else {
echo '<span class="imgList">Данный формат запрещен!</span>';
}
}
}
?>
IV. Добавляем CSS стили для блоков
#preview {
color: #cc0000;
font-size: 12px;
}
.imgList {
max-height: 150px;
margin-left: 5px;
border: 1px solid #dedede;
padding: 4px;
float: left;
}
Вот и все! При желании данный скрипт легко переделать под загрузку любых файлов на сервер. Также не забываем выставить права на запись для необходимой директории.
Скачать готовый скрипт можно здесь.