|
 3.9 Кб |
|
| 1. Если $_POST-данные получены, устанавливаю переменные, которые определяют, на какую страницу, в какой модуль следует поместить текст+картинки
2. Проверяю $_POST-данные на ошибки, передаю их в функцию загрузки файлов
3. Определяю папки, куда нужно грузить файлы
4. Определяю имя файла, проверяю его тип
5. Ставлю флаг $foto = 0 (наличие хотя бы одной картинки)
6. Загрузка текстового файла в папку с текстами модуля
7. Проверяю параметры картинок, после этого загружаю картинки в цикле в ту же папку, что и текст, после цикла флаг =1
8. Если флаг = 1, вставляем данные про картинки в базу
9. Если текст загрузился правильно, вставляем в базу данные про текст.
Проблема: мне в таблицу картинок нужно вставить id текста, в который вставляются эти картинки, поэтому данные про текст должны загрузиться в базу раньше, чем данные про картинки. У меня же наоборот. Как мне логику построить?
Скрипт прикрепила. | |
|
|
|
|
|
|
|
для: Лена
(19.11.2008 в 17:19)
| | Запишите текст в базу. Получите id записи. Обновите поля этой записи, которые содержат имена изображений, по полученному ранее id, после успешной загрузки картинок на сервер.
PS. Я вам говорил, что браузеры отличные от IE могут пердавать типы совсем не так, поэтому, если проверять их таким путем, то массив должен иметь описание всех возможно передаваемых. Конечно, если это только для себя и работать только в IE, то можно оставить так.
PPS. Вы просто оставили мой пример как есть. А нужно, сразу после проверки загрузки текста, внести соответсвующую запись базу и т.д.. Я ведь писал, что в примере пропущено все - от проверок до необходимых действий. У вас ведь проблема была в незагрузке картинок на сервер, для чего собственно и был написан этот пример. | |
|
|
|
|
|
|
|
для: sim5
(19.11.2008 в 17:23)
| | У меня в таблице текстов нет полей для изображений. В таблице изображений у меня есть поле для id текста.
>PS. Я вам говорил, что браузеры отличные от IE
У меня есть этот массив. Посмотрите в код.
Совсем запуталась. Буду думать. | |
|
|
|
|
|
|
|
для: Лена
(19.11.2008 в 17:42)
| | Ну значит полученный id запишите в таблицу изображений. У вас ведь картинки пренадлежат тексту, а не наоборот. Сразу после записи текста (или его пути) в таблицу, выполните, например:
$id = mysql_insert_id();
и перменная $id будет содержать номер записи, а после успешной загрузки изображений используйте ее.
Масси типов то есть, но так пердает IE. Вы запустите простой скрипт загрузки файла на сервер под основными браузерами, загружая различные типы данных, и выведите массив FILES на экран. Посмотрите как они передают типы. | |
|
|
|
|
 1.9 Кб |
|
|
для: sim5
(19.11.2008 в 18:21)
| | >$id = mysql_insert_id();
Это уже знаю, Trianon рассказывал. Сделаю чуть позже, если сегодня успею, покажу. Сейчас с другим разбиралась (то, что ниже идет).
>Вы запустите простой скрипт загрузки файла на сервер под основными браузерами,
Скрипт запустила - прикрепила то, что запускала.
Загружаю gif-файл в Опере, получаю массив:
Array
(
[myfile] => Array
(
[name] => Name1.gifD.gif
[type] => image/gif
[tmp_name] => Z:\tmp\php48.tmp
[error] => 0
[size] => 3171
)
)
|
В Мозилле то же самое:
Array
(
[myfile] => Array
(
[name] => Name1.gifD.gif
[type] => image/gif
[tmp_name] => Z:\tmp\php4C.tmp
[error] => 0
[size] => 3171
)
)
|
То же самое и с doc-файлом. И в Эксплорере та же самая картина. А вы на каких файлах пробовали, когда писали сообщение?
И еще один вопрос: почему нельзя расширение файла выделять вот так:
$uploadfile = $uploaddir . date("m.d.y_H.i_") . strrchr($_FILES['text']['name'], ".");
или через pathinfo()? | |
|
|
|
|
|
|
|
для: Лена
(19.11.2008 в 23:09)
| | Я не пробую, лишь говорю, что проверять надо. Кстати тип .doc это как пример у меня, не думаю, что вы будете этот формат файла загружать (ну если только не для закачки последующей пользователем), и разбирать его для отображения на странице. Скорее всего вы будет загружать готовый html, ну или чистый txt. Так что это можно и убрать вообще.
Что касается определения типа файла посредством расширения (после точки) - да пожалуйста, если это вы пишите для себя как администратора, в противном случае, я могу любую картинку обозвать расширением .txt, или текст расширеним .jpg и вы это "скушаете". Вот тут и посмотрите как в такой ситуации принимается (опознается) тип. | |
|
|
|
|
|
|
|
для: sim5
(20.11.2008 в 06:58)
| | Я думаю, проблема вот в чем.
if (!$_FILES['img']['error'][$i]){
//проверяю параметры файла, загружаю в папку, даю сведения о нем в базу
}
У меня три поля для вставки изображений. Если я загружаю 1 картинку, в массиве $_FILES появляется сообщение об ошибке:
$_FILES [img][error] => Array
(
[0] => 0
[1] => 4
[2] => 4
)
Одна картинка загружена - ошибок нет [0] => 0
два поля пустые, в них картинки не были загружены, там появляется ошибка 4. Что это значит? Думаю, что причина в этом | |
|
|
|
|
|
|
|
для: Лена
(20.11.2008 в 14:37)
| | Причина чего? Не правильной записи в базу? Запись (последовательность) не должна зависить от загрузки или нет изображений.
Если вы загружаете из трех одно, то естественно у двух последних будет код ошибки 4 - изображение не загружено. А не загружены значит нет их, зачем для них что-то писать в базу?
Если проверять по полной, то, коды ошибок:
UPLOAD_ERR_OK
Значение: 0; Ошибок не возникало, файл был успешно загружен на сервер.
UPLOAD_ERR_INI_SIZE
Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.
UPLOAD_ERR_FORM_SIZE
Значение: 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.
UPLOAD_ERR_PARTIAL
Значение: 3; Загружаемый файл был получен только частично.
UPLOAD_ERR_NO_FILE
Значение: 4; Файл не был загружен. | |
|
|
|
|
|
|
|
для: sim5
(20.11.2008 в 14:48)
| | На параметры я правильно проверяю?
//проверка картинки на параметры
$max_image_width = 400;
$max_image_height = 500;
$max_img_size = 20000000;
if (filesize($_FILES['img']['size'][$i]) >= $max_img_size) echo "Размер файла больше " . $max_img_size;
if (!exif_imagetype($_FILES['img']['type'][$i])) echo "Неправильное расширение файла.";
$size = GetImageSize($_FILES['img']['size'][$i]);
if (($size[0][$i] >= $max_image_width) || ($size[1][$i] >= $max_image_height)) echo "Ширина и высота превышают максимум";
if (move_uploaded_file($_FILES['img']['tmp_name'][$i], $uploaddir . $filename . "-" . ($i+1) . $ext)){
|
| |
|
|
|
|
|
|
|
для: Лена
(20.11.2008 в 17:08)
| | exif_imagetype - если включена поддержка.
GetImageSize($_FILES['img']['size'][$i]) - нет, не правильно, GetImageSize() получает размер реально существующего файла, вы же пытаетесь получить размер переменной массива FILES. Хотите получить размеры загруженного файла, значит получайте его у $_FILES['img']['tmp_name'][$i]. | |
|
|
|
|
|
|
|
для: sim5
(20.11.2008 в 17:31)
| | Как включить поддержку?
Fatal error: Call to undefined function exif_imagetype() in Z:\home\avart.ua\www\upload1.php on line 81
|
Из мануала:
Примечание: эта функция доступна только в PHP 4, скомпилированном с --enable-exif.
У меня PHP 5. В конфиг-файле вот этой строчки нет. Где ее искать?
Без вот этой строки и изображения, и текст все нормально грузятся. Нашла причину | |
|
|
|
|
|
|
|
для: Лена
(20.11.2008 в 17:42)
| | Ну если вы даже ее и подключите, вы все равно не верно к ней обращаетесь, то есть:
exif_imagetype() также должна обращаться к реальному файлу, а не элементу массива как это у вас. Можете не беспокоится о подключении, тоже самое вы можете узнать с помощью getimagesize().
PS. Если все таки есть большая необходимость в этой функции, то должна быть подключена библиотека php_exif.dll. | |
|
|
|
|
|
|
|
для: sim5
(20.11.2008 в 17:50)
| | Это я уже поняла, что нужно получить тип реального файла.
Исправила:
if ($size[2] !== $type[$_FILES['img']['tmp_name'][$i]]) echo "Неправильное расширение файла.";
Ошибок не выдает, везде порядок. За это спасибо.
Теперь все в базу грузить буду.
Где эту библиотеку взять? Раз уже заговорили о ней, теперь все говорите. | |
|
|
|
|
|
|
|
для: Лена
(20.11.2008 в 17:59)
| | if ($size[2] !== $type[$_FILES['img']['tmp_name'][$i]]) - вот совсем не понял, что это означает?
То есть вы узнали тип у загруженного файла, затем проверяете его по перчисленному в массиве, так? Так как можно обратиться к элементу массива по $_FILES['img']['tmp_name'][$i] ?
А если вы не хотите принимать файлов кроме JPG, GIF, PNG, то зачем вообще делать проверку через какой-то массив типов?
Эта библиотека может лежать в папке Денвера WebServers\usr\local\php5\ext, и закомментирована в php.ini. Если ее у вас нет, то нужно скачать, положить в эту папку и раскомментировать в расширениях.
PS. Если вы таким образом хотите получить расширение и проверить сразу на допустимось типа файла. То делайте так (возможно этого нет в вашем РНР-мануале):
<?
$size = getimagesize($_FILES['img']['tmp_name'][$i]);
$ext = array_key_exists($size['mime'], $type) ? $type[$size['mime']] : NULL;
if ($ext) //загрузка изображения
else //ошибка типа
|
Только в массиве расширений нужно сменить ключ image/pjpeg на image/jpeg | |
|
|
|