|
|
|
| Помогите плз. Уже 3 часа мучаюсь не чего, не получается. Проблема в следующем:
Есть часть кода:
. . . . . . . . .
$language = rus;
$cur_id = 10;
$dir = 'files/ ';
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
{
$file = get_filename($dir, $_FILES['newfile']['name']);
copy($_FILES['newfile']['tmp_name'], $dir.$file);
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
}
$cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';
$cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';
$cont .= '</table></form>';
. . . . . . . . .
|
Т.е есть форма через которую я загружаю фаил в категорию $dir.
Задача в следующем, чтоб при загрузке файла проверялось наличие папки (има которой равно $cur_id) на сервере и если папка не существует, то чтоб он ее создавал и закидывал туда фаил, а если папка существует, то чтоб просто закидывал туда фаил.
Надеюсь, моя мысль понятна.
Заранее спасибо! | |
|
|
|
|
|
|
|
для: nikolai
(24.11.2009 в 02:11)
| | попробуй mkdir(); | |
|
|
|
|
|
|
|
для: Slo_Nik
(24.11.2009 в 03:02)
| | а как сделать проверку... существует ли папка на сервере ?
if (isset папка на сервере)
{
....
}
else
{
...
} | |
|
|
|
|
|
|
|
для: nikolai
(24.11.2009 в 23:57)
| | Ну ведь признайтесь, даже не пытались поискать в документации? | |
|
|
|
|
|
|
|
для: neadekvat
(25.11.2009 в 00:01)
| | Вы ошиблись, возможно я плохая поисковая машина… да и ко всему совершенно не разбираюсь в php..
вот что нашел:
if(file_exists("/files/10"))
{
if(is_dir("/files/10"))
{
echo "Директория существует";
}
}
токо не получается все вышесказанное граматно написать :( | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 00:37)
| | все сделал. результат:
. . . . . . . . .
$language = rus;
$cur_id = 10;
$dir = 'files/gallery/'.$cur_id.'/';
if(file_exists($dir))
{
if(is_dir($dir))
{//Директория существует
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
{
$file = get_filename($dir, $_FILES['newfile']['name']);
copy($_FILES['newfile']['tmp_name'], $dir.$file);
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
}
$cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';
$cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';
$cont .= '</table></form>';
return $cont;
}
}
else
{//Директория не существует
$new_dir = mkdir ($dir, 0777);
if($new_dir)
// Каталог успешно создан
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
else
$cont .= 'Ошибка создания каталога - Error Creating directory';
return $cont;
}
. . . . . . . . .
|
Теперь надо попробовать реализовать удаление папки, когда будет удален последний фаил из нее :)
Всем спасибо ! | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 01:00)
| | copy($_FILES['newfile']['tmp_name'], $dir.$file); - о copy в этом случае забыть. | |
|
|
|
|
|
|
|
для: sim5
(25.11.2009 в 06:17)
| | Не совсем Вас понел… | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 13:54)
| | имелось ввиду, что вместо copy использовать move_uploaded_file | |
|
|
|
|
|
|
|
для: Slo_Nik
(25.11.2009 в 14:02)
| | Как я уже говорил, я не силен в пхп. По этому я не вижу разницы между этими функциями. | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 14:09)
| | Разница как раз большая. | |
|
|
|
|
|
|
|
для: sim5
(25.11.2009 в 14:10)
| | чтото не павельно у меня.
. . . . . . . . .
$language = rus;
$cur_id = 10;
$dir = 'files/gallery/'.$cur_id.'/';
if(file_exists($dir))
{
if(is_dir($dir))
{//Директория существует
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
{
/* $file = get_filename($dir, $_FILES['newfile']['name']);
copy($_FILES['newfile']['tmp_name'], $dir.$file);
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language); */
foreach ($_FILES["newfile"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["newfile"]["tmp_name"][$key];
$name = $_FILES["newfile"]["name"][$key];
move_uploaded_file($tmp_name, "$dir/$name");
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
}
}
}
$cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';
$cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';
$cont .= '</table></form>';
return $cont;
}
}
else
{//Директория не существует
$new_dir = mkdir ($dir, 0777);
if($new_dir)
// Каталог успешно создан
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
else
$cont .= 'Ошибка создания каталога - Error Creating directory';
return $cont;
}
. . . . . . . .
|
Warning: Invalid argument supplied for foreach() in /home/v3863/public_html/inc/obj_gallery.php on line 38
38линия:
foreach ($_FILES["newfile"]["error"] as $key => $error) {
|
| |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 14:27)
| | вот с этой строки начни ошибку искать
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error'])) | |
|
|
|
|
|
|
|
для: Slo_Nik
(25.11.2009 в 14:47)
| | Что-то я запутался, раньше когда делал через copy все было ок. | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 14:55)
| | copy может служить причиной совсем иных проблем у вас. Не рекомендуется использовать ее при загрузке файлов, читайте мануал. | |
|
|
|
|
|
|
|
для: sim5
(25.11.2009 в 15:03)
| | В принципе я это понял с сайта php.net вот только не получается мне поменять на move_uploaded_file, чтото я делаю не так ! | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 15:12)
| | У вас и copy, и move_uploaded_file, все в одной куче.... | |
|
|
|
|
|
|
|
для: sim5
(25.11.2009 в 16:02)
| | copy закомментировано, проблема, я думаю, начинается с $_FILES['newfile'] | |
|
|
|
|
|
|
|
для: Slo_Nik
(25.11.2009 в 16:06)
| | Проблемы начинаюся в самой структуры скрипта. Я лично не понимаю такого:
Бог его знает, был ли запрос на загрузку изображения или нет, но почему-то все начинается с проверки "есть ли каталог", и получается, если нет, а загрузку запросили, то бросаем все нафик и создаем каталог.... И что?
Ладно, бог с ним, пусть так, но опять, ни с того ни с чего начинаем "гонять" в цикле возможные ошибки при загрузке, а зачем?
Автору: Добавляйте в код РНР теги, ну хреново без подсветки! | |
|
|
|
|
|
|
|
для: sim5
(25.11.2009 в 16:17)
| | Постараюсь рассказать, почему именно так. Одно из первых –это то, что я полный “бум-бум” в пхп, только стараюсь делать первые шаги. Возможно по этому иду не по тому пути.
Второе это то что эта cms не моя (у ней нет ни владельца, ни названия), когда-то я ее покупал для своей фирмы. На ней висел небольшой сайт. Она очень мало функциональная и достаточно простая. В связи с увлечением пхп я ставлю для себя задачи и ее дорабатываю, т.е изучаю пхп.
Проблема в том что у ней сложная система создания разделов(для меня), не понять мне ее смысла, а я решил усовершенствовать для нее фото галерею. Раньше было просто на одной странице все изображения, а я решил сделать чтоб выло много таких разделов и под разделов, чтоб это была галерея, а не страница альбома.
Т.е этот фаил отвечает и за вывод изображений на сайте из определенной папки, и также за вывод и редактирование в админке.
Проблема была в том что когда создается объект (раздел/категория), то надо чтоб создавалась и папка на сервере с ID номером этого объекта. В связи с выше перечисленным для меня это сделать не реально и я решил сделать иначе, когда заходишь через админку в этот объект(раздел/категорию) для редактирования, то чтоб сразу была проверка на папку и создания ее. Все получилось и работает как планировал.
У того, кто писал этот скрипт, добавление изображений было сделано через copy и все прекрасно работает, но вы советуете переделать copy на move_uploaded_file.
И вот эта часть кода с переделкою под move_uploaded_file которая не работает из-за ошибки:
Warning: Invalid argument supplied for foreach() in /home/v3863/public_html/inc/obj_gallery.php on line 38
линия 38:
<?
foreach ($_FILES["newfile"]["error"] as $key => $error) {
?>
|
<?
$language = rus;
$cur_id = 10;
$dir = 'files/gallery/'.$cur_id.'/';
if(file_exists($dir))
{
if(is_dir($dir))
{//Директория существует
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
{
/* $file = get_filename($dir, $_FILES['newfile']['name']);
copy($_FILES['newfile']['tmp_name'], $dir.$file);
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language); */
foreach ($_FILES["newfile"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["newfile"]["tmp_name"][$key];
$name = $_FILES["newfile"]["name"][$key];
move_uploaded_file($tmp_name, "$dir$name");
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
}
}
}
$cont .= '<form method="post" ENCTYPE="multipart/form-data"><table>';
$cont .= '<tr><td><input type=file name=newfile></td><td><input type=submit name=create value=upload></td></tr>';
$cont .= '</table></form>';
return $cont;
}
}
else
{//Директория не существует
$new_dir = mkdir ($dir, 0777);
if($new_dir)
// Каталог успешно создан
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language);
else
$cont .= 'Ошибка создания каталога - Error Creating directory';
return $cont;
}
?>
|
| |
|
|
|
|
|
|
|
для: nikolai
(26.11.2009 в 01:23)
| | Начну с конца:
>но вы советуете переделать copy на move_uploaded_file
Это не я советую, а разработчики, и на это есть веские причины. Эта функция появилась в версии 4.0.3, до этого использовалась copy.
move_uploaded_file проверяет, является ли файл filename правильно загруженным файлом (что он был загружен через PHP-механизм HTTP POST). Если файл является правильным, он будет переименован в файл destination.
Если filename не является правильно загруженным файлом, акции не будет, а move_uploaded_file() возвратит FALSE.
Если filename является правильно загруженным файлом, но не может быть перемещён по каким-то причинам, акции не будет, а move_uploaded_file() возвратит FALSE. Кроме того, будет выдано предупреждение.
Этот вид проверки особенно важен, если имеется вероятность того, что какие-нибудь действия с загруженными файлами могут сделать его содержимое доступным пользователю или даже другим пользователям в той же системе.
Примечание: если safe mode включён, PHP проверяет, имеют ли файл(ы)/директории, с которыми вы собираетесь работать, тот же UID, что и выполняемый скрипт.
Примечание: на move_uploaded_file() не действуют нормальные safe-mode UID-ограничения. Это не опасно, поскольку move_uploaded_file() работает только с файлами, загруженными через PHP.
Функция copy не делает вышесказанного.
>этот фаил отвечает и за вывод изображений на сайте из определенной папки, и также за вывод и редактирование в админке
О каком файле речь, о вашем скрипте?
Загрузка изображения и вывод его, это кардинально разные задачи. Загрузка производится однократно и одним пользователем, а вывод запрашивают многократно и многие пользователи, и механизм этих процессов как небо и земля.... Да и не видно у вас тут никакого вывода.
Редактирование в админке уже загруженного файла может означать только его удаление или перемещение в другую папку. Другого просто не может быть (не считая работы с файлом средствами GD). Что совмещать здесь?
Вы можете ответить на вопрос - зачем вы гоняете цикл возможных ошибок загрузки? Если файл загружен успешно, $_FILES["newfile"]["error"] что возвращает?
Вместо того, чтобы гонять попусту этот цикл, вы бы лучше обрабатывали эти ошибки, и выдавали пользователю информацию о них. Вы же этого не делаете, и не понятно, для чего вы его "крутите"....
Загрузка:
1. Есть запрос от формы с загрузкой файла.
2. Нет ошибок загрузки (ответьте на вопрос выше)?
3. Ошибок нет. Каталог существует?
4. Если каталог не существует, создаем и перемещаем в него загруженное изображение. Если существует, просто перемещаем.
5. Перенаправление при ОК.
6. Если были ошибки загрузки, возвращаем форму пользователю с ошибками.
Под каким ID, и что это за ID, и почему от этого проблемы мне не ведомо. Но всегда можно решить любую проблему, если подходить к ее решению обдуманно. | |
|
|
|
|
|
|
|
для: sim5
(26.11.2009 в 04:39)
| | Sim5
В чем разница между copy и move_uploaded_file я уже читал на сайте, который вы давали выше. Все равно Спасибо за повторное обьяснение.
О каком файле речь, о вашем скрипте?
О пхп файле, в котором я и редактирую этот кусочек кода.
.... Да и не видно у вас тут никакого вывода.
Я устал повторять, что это кусок кода. Зачем мне весь код выкладывать, если у меня был поставлен вопрос только о конкретной задаче. Если желаете видеть весь код, то могу его выставить.
зачем вы гоняете цикл возможных ошибок загрузки?
http://www.php.net/manual/en/function.move-uploaded-file.php
На сайте есть пример. Я скопировал и перенес к себе. | |
|
|
|
|
|
|
|
для: nikolai
(26.11.2009 в 11:55)
| |
<?
if(sizeof($_FILES)>0 && !empty($_FILES['newfile']) && empty($_FILES['newfile']['error']))
{
/* $file = get_filename($dir, $_FILES['newfile']['name']);
copy($_FILES['newfile']['tmp_name'], $dir.$file);
header('Location: ?obj=struct&id='.$cur_id.'&lng='.$language); */
foreach ($_FILES["newfile"]["error"] as $key => $error) {
|
Здесь путаница в логике.
Если у Вас empty($_FILES['newfile']['error']) то нет смысла пытаться работать с $_FILES["newfile"]["error"]? и уж тем более - делать по нему цикл, считая его за массив.
Кроме того, массивом этот элемент будет лишь при нескольких файловых полях в форме, а у Вас поле явно лишь одно.
Ну и еще замечу, что вызов header('Location:...') вообще-то прямо не приводит к прекращению исполнения текущего файла. Это нужно сделать явным образом, иначе побочные эффектоы будете потом искать тяжело и долго. | |
|
|
|
|
|
|
|
для: Trianon
(26.11.2009 в 12:10)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: nikolai
(25.11.2009 в 15:12)
| | если в начале скрипта не выставлен уровень ошибок, то сделайте это, посмотрите, что выдаст Вам.
error_reporting(E_ALL); | |
|
|
|
|