|
|
|
| Друзья!
В 4 утра!
Пользователь корректирует свое название и загружает свой логотип.
<?php
/**
* Function of uploaded of a file
* Функция загрузки файла (аплоадер)
* @param int $max_file_size максимальный размер файла в килобайтах
* @param array $valid_extensions массив допустимых расширений
* @param string $upload_dir директория загрузки
* @return array сообщение о ходе выполнения
*
* @author IT studio IRBIS-team (www.irbis-team.com)
* @copyright © 2009 IRBIS-team
*/
function uploadHandle($max_file_size = 100, $valid_extensions = array(), $upload_dir = '.')
{
$error = null;
$info = null;
$max_file_size *= 1024;
if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)
{
// проверяем расширение файла
$file_extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);
if (in_array($file_extension, $valid_extensions))
{
// проверяем размер файла
if ($_FILES['userfile']['size'] < $max_file_size)
{
$destination ="img/logo_pu/" . $_FILES['userfile']['name'];
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))
$info = 'Файл успешно загружен';
else
$error = 'Не удалось загрузить файл';
}
else
$error = 'Размер файла больше допустимого';
}
else
$error = 'У файла недопустимое расширение';
}
else
{
// массив ошибок
$error_values = array(
UPLOAD_ERR_INI_SIZE =>
'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',
UPLOAD_ERR_FORM_SIZE =>
'Размер файла превышает указанное значение в MAX_FILE_SIZE',
UPLOAD_ERR_PARTIAL => 'Файл был загружен только частично',
UPLOAD_ERR_NO_FILE => 'Не был выбран файл для загрузки',
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск'
);
$error_code = $_FILES['userfile']['error'];
if (!empty($error_values[$error_code]))
$error = $error_values[$error_code];
else
$error = 'Случилось что-то непонятное';
}
return array('info' => $info, 'error' => $error);
}
/////////////////////////////////////////////////////////////////////
$extensions = array('jpg', 'jpeg', 'png', 'gif');
$upload_dir = 'images';
// Запускаем функцию
if(!empty($_POST['upload_submit']))
{
$message = uploadHandle(200, $extensions, $upload_dir);
// Выводим сообщение
echo $message['error'] ? $message['error'] : $message['info'];
}
?>
<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data">
<table width="650" cellspacing="5" cellpadding="5">
<tr>
<td width="200" valign="top"><b>Название организации:</b></td>
<td width="550" align="left" style='background-color:#f0f0f0'>
<input value= "<?php echo $_GET['title']; ?>" type="text" name="title" size="80">
</td>
</tr>
<tr>
<td width="200" valign="top"><b>Logotip:</b></td>
<td><input type="file" name="logo" value="<?php echo $_GET['logo']; ?>">загрузить</td>
</tr>
</table>
<input name="id_pu" type="hidden" value="<?php echo $_GET['id_pu']; ?>">
<br>
<center>
<label>
<input type="submit" value="Сохранить изменения" name="upload_submit" id="submit">
</label>
</center>
</form>
</td>
</tr>
</table>
|
Array
(
[logo] => Array
(
[name] => Яyutex.png
[type] => image/png
[tmp_name] => /tmp/phplPmhDQ
[error] => 0
[size] => 92734
)
)
|
В данном случае в БД в поле logo записывается содержимое временной папки /tmp/phplPmhDQ
Содержимое папки logo на сервере пусто.
Покажите ошибку | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 04:16)
| | стоит привести файл pu_add.php
if (isset($_POST['logo'])) {$logo = $_POST['logo']; if ($logo == '') {unset ($logo);}}
if (isset($logo) {
$result = mysql_query ("insert pu SET logo='$logo',
|
Название организации меняется, а вот с логотипом проблемы | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 05:03)
| | Повторю последний раз, включите мозги наконец то!!!
Название файла берите из массива $_FILES, а не из массива $_POST, потому что вот это
<input type="file" name="logo" value="<?php echo $_GET['logo']; ?>
|
бред сивой кобылы в лунную ночь...
разве у Вас название логотипа есть в массиве $_POST?
и где у Вас проверка содержимого массива в коде, где контроль ошибок?! Всё это должно быть прописано постоянно, в начале кода на момент отладки скрипта.
И ещё
стоит привести файл pu_add.php
надо сразу приводить тот код с которым работаете и в котором проблема, а не лепить что первое под руку попадётся, как в этом случае, так в во втором.
И последнее, если Вы загружаете логотип в этом файле, так и запись в базу производите тоже в этом файле.
Принцип такой.
1)Проверяете файл
2)Если нет ошибок - грузите
3)Если загрузка прошла успешно - записываете в базу имя файла
Всё в одном файле
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.01.2012 в 13:10)
| |
<td width="200" valign="top"><b>Logotip:</b></td>
<td><input type="file" name="logo" value="<?php echo $_FILES['name']; ?>">загрузить</td>
|
Все равно записывается название временного файла. Ошибок нет
Array
(
[logo] => Array
(
[name] => ЯБезымянный.png
[type] => image/png
[tmp_name] => /tmp/phprkWObP
[error] => 0
[size] => 69972
)
)
|
| |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 15:21)
| | И последнее, если Вы загружаете логотип в этом файле, так и запись в базу производите тоже в этом файле.
Как это сделать если включается обработчик:
<form name="add" method='post' action='pu_add.php' enctype="multipart/form-data"> | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 15:31)
| | видно не запускается
// Запускаем функцию
if(!empty($_POST['upload_submit']))
{
$message = uploadHandle(200, $extensions, $upload_dir);
// Выводим сообщение
echo $message['error'] ? $message['error'] : $message['info'];
|
| |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 15:31)
| | И Вам не выдаёт ни каких ошибок?
<input type="file" name="logo" value="<?php echo $_FILES['name']; ?>
|
>Как это сделать если включается обработчик:
Вы знаете зачем атрибут "action" для тега <form> ?Как это сделать если включается обработчик:
Вы знаете зачем атрибут
[поправлено модератором] | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.01.2012 в 16:16)
| | вы писали:
Название файла берите из массива $_FILES, а не из массива $_POST,
ну я и взял. Что нет так? | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 16:18)
| | пропишите ка вначале скрипта error_reporting()
Как Вы можете получить из этого массива имя, если файл ещё не отправлен и массив пустой? | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 16:18)
| | Дело в том, что $_FILES двумерный массив, первое измерение - имя загружаемого файла, второе - имя параметра. В вашем случае, если хотите получить имя файла, нужно использовать
<?php echo $_FILES['logo']['name']; ?>
|
| |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 16:32)
| | тут дело даже не в том, что массив двухмерный, а в том, что пытается использовать атрибут value для input с типом file, да и ещё подставить значение, которого не существует до отправки формы. | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.01.2012 в 16:40)
| | Да согласен, это невозможно. Нужно просто при попытке изменить файл, удалять старый и загружать новый. Здесь ни браузер с сервером, ни PHP не предоставляют автоматический код, все эти операции придется программировать вручную.
1) Проверить загружается ли файл
2) Если загружается, удалить старый
3) Поместить на его место новый
4) Исправить запись в базе данных | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 16:44)
| | Вы согласны, я согласен и ещё пару человек как минимум, которые тоже отвечали на вопросы Василия.
Проблема в том, что Василий не хочет думать и пытается делать всё сразу, вместо того, чтобы разбить решение на этапы.
1)Объединить формы и проверить корректность html
2) Загрузить файл, добиться того, чтобы файл загружался туда куда надо и под нужным именем
3) Объединить обработчики
4)В завершении всего записать новое имя в Базу Данных
5) Контролировать ошибки и содержимое массивов $_POST и $_FILES
Я не говорю, что я гений, знаю не намного большего чем Василий, но давно уяснил, что поэтапное решение лучше всего.
Теперь для Василия
<?php
if(!empty($_POST['upload_submit']))
{
$message = uploadHandle(200, $extensions, $upload_dir);
// Выводим сообщение
echo $message['error'] ? $message['error'] : $message['info'];
// Вот здесь я бы проверил, что возвращает функция, что содержит $message
// и если содержит сообщение об успешной загрузке файл - создавать запрос и писать в базу
}
|
это как вариант решения задачи, а их может быть несколько | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.01.2012 в 16:55)
| | >но давно уяснил, что поэтапное решение лучше всего.
Тоже так считаю, но уж больно много всего в Web, тут 10 лет не хватит, чтобы охватить все технологии, с чего-то нужно начинать.
>Проблема в том, что Василий не хочет думать и пытается делать всё сразу, вместо того, чтобы
>разбить решение на этапы.
Нормально он думает, просто информации у него пока мало (а у нас она на подкорку вывалилась и нам приходится напрягаться, чтобы вспоминать и прописывать вещи, которые уже давно кажутся само собой разумеющимися - ничего, это полезно :). Василий же, посмотрит, приобретет опыт и сам решит, как ему штурмовать эту гору (последовательно или мощной атакой по всем направлениям). Может он вообще развернется и пойдет штурмовать что-то другое :))) | |
|
|
|
|
|
|
|
для: Slo_Nik
(04.01.2012 в 16:40)
| | так как надо то? | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 16:44)
| | Просто смотреть, будет ли пользователь загружать файл, если поля массива $_FILES['logo'] заполнены, значит, пользователь пытается заменить файл, действуйте по алгоритму, описанному постом выше. Если поля пусты, значит он хочет, чтобы файл остался старым и ничего с ним делать не нужно. | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 16:46)
| | $error = 'Случилось что-то непонятное'; "
выводится - Случилось что-то непонятное | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 17:01)
| | поля массива $_FILES['logo'] заполнены
так запись
<td><input type="file" name="logo" value="<?php echo $_FILES['logo']['name']; ?>">загрузить</td>
|
не верна? | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 17:03)
| | Нет, не верна. Тут есть две хитрости. Малая заключается в том, что input-тэги типа file не имеют атрибута value, его можно писать, можно не писать - этот атрибут просто игнорируется. Не будем сейчас вдаваться почему, сделано это из соображений безопасности и очень давно. Т.е. подставить в поле значение у вас не получится. При редактировании оно останется пустым, только сам пользователь может его заполнить, если захочет (например, чтобы загрузить новый файл).
Вторая хитрость более глобальная и заключается в том, что вы работаете над технологией Web-программирования. Тут просто одним знанием PHP не обойтись. Нужно знать другие языки и технологии, вот эта заковыка с file, это область языка разметки HTML, который вообще говоря тоже нужно знать и возможно вперед PHP, так как незнание его вам мешает разрабатывать PHP-приложения.
Это не упрек, это просто состояние дел, как вы понимаете, не мы придумали, чтобы Web-приложения создавались с использованием десятков языков и сами не в восторге от этого :))), но чтобы писать приложения вам придется много изучить и одним PHP, к сожалению, не обойтись. Пока просто знайте, что в file нельзя подставить значение, как в text или textarea. | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 17:14)
| | получилось!
Спасибо. Файл записывается.
Есть вопрос. Открываю другую тему | |
|
|
|
|
|
|
|
для: Василий
(04.01.2012 в 17:26)
| | УРА!!! СВЕРШИЛОСЬ ЧУДО!!! )))
Удачи в дальнейшей разработке | |
|
|
|