Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Загрузка файлов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: загрузка файлов на сервер
maroz89
Отправлено: 25 Июня, 2010 - 15:25:34
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Написал скрипт для автоматического создания деректории, загрузки графических файлов не более 1мб на сервер и вставки пути к картинке в базу данных!!
вот кусок формы ято отвечает за загрузку файла
CODE (htmlphp):
скопировать код в буфер обмена
  1. <img  src='img/link.png'> Введите путь к картинке<br><input type='text' size='50' name='mini_img'><br><input type='hidden' name='MAX_FILE_SIZE' value='1000'><br>Загрузить изображение:<input name='userfile' type='file'>


кусок обработчика, что отвечает за загрузку

CODE (htmlphp):
скопировать код в буфер обмена
  1. $date_dir = date('Ymd');
  2. $path_dir = "/files/".$date_dir;
  3.  
  4. if (!is_dir('$path_dir') && $_FILES['userfile']['size'] < 1024*1*1024){
  5. mkdir('$path_dir', 0700);}
  6. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  7. move_uploaded_file($_FILES['userfile']['tmp_name'], '$path_dir');
  8. }
  9. $mini_img ="files/".$date_dir."/".$_FILES['userfile']['name'];
  10. if (!empty($category) && !empty($title) && !empty($meta_d)&& !empty($meta_k)&& !empty($description)&& !empty($text)&& !empty($date)&& !empty($author)&& !empty($mini_img)){
  11. if ($num_title <= 68){
  12. $result = mysql_query("INSERT INTO base (cat,title,meta_d,meta_k,description,text,date,author,mini_img,views) VALUES ('$category','$title','$meta_d','$meta_k','$description','$text','$date','$author','$mini_img','0')");

при попытке загрузить файл, деректория не создается, картинка соотвественно не грузится, а в базу данных вставляется путь вида files/20100625/ (без названия файла)
Подскажите шде тут ошибка? Ниндзя

(Отредактировано автором: 25 Июня, 2010 - 15:27:15)

 
 Top
kochan10
Отправлено: 25 Июня, 2010 - 16:52:30
Post Id


Гость


Покинул форум
Сообщений всего: 118
Дата рег-ции: Дек. 2009  


Помог: 0 раз(а)




$mini_img ="files/".$date_dir."/".$_FILES['userfile']['name'];
Он заносит в базу то, что ему и дают=)
Остальное по-детальнее посмотрю
 
 Top
maroz89
Отправлено: 25 Июня, 2010 - 20:29:09
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




kochan10 пишет:
Он заносит в базу то, что ему и дают=)

)) не ну оно и понятноУлыбка вопрос не почему именнго такого вида строка, а почему не грузиццо файл, не создается каталог и соотвественно вот эта часть пути
CODE (htmlphp):
скопировать код в буфер обмена
  1. $_FILES['userfile']['name'];
не заносится в базуУлыбка

(Отредактировано автором: 25 Июня, 2010 - 20:30:03)

 
 Top
Мелкий Супермодератор
Отправлено: 25 Июня, 2010 - 21:25:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)





сделайте echo '$path_dir' и удивитесь Подмигивание
Спойлер (Отобразить)


-----
PostgreSQL DBA
 
 Top
maroz89
Отправлено: 26 Июня, 2010 - 14:11:53
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Мелкий пишет:
сделайте echo '$path_dir' и удивитесь

сделал... и не удивилсяУлыбка папка то создается, но не там где нужно, а в папке "админ", а нужно в папке сайта! я так понял путь задан не правельно

Задаю такой путь
CODE (htmlphp):
скопировать код в буфер обмена
  1. $path_dir = "/home/phpblog/www/files/".$date_dir;

создается там где нужно! и при том же в таком виде
CODE (htmlphp):
скопировать код в буфер обмена
  1. $path_dir = "/phpblog/www/files/".$date_dir;

уже не работает! как можно задать так, чтоб не указывать папку home! чтоб при переносе на сервер не менять, ведь корневая папка на севере может назваться по-разному к примеру html и тд...

ну и проблемма осталась в том, что файл в эту папку не грузится и имя файла не прописывается в путь!

CODE (htmlphp):
скопировать код в буфер обмена
  1. $date_dir = date('Ymd');
  2. $path_dir = "home/phpblog/www/files/".$date_dir;
  3.  
  4. if (!is_dir(print '$path_dir') && $_FILES['userfile']['size'] < 1024*1*1024){
  5. mkdir(print '$path_dir', 0700);
  6. }
  7. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  8. move_uploaded_file($_FILES['userfile']['tmp_name'], '$path_dir');
  9. }
  10. $mini_img ="files/".$date_dir."/".$_FILES['userfile']['name'];
  11. if (!empty($category) && !empty($title) && !empty($meta_d)&& !empty($meta_k)&& !empty($description)&& !empty($text)&& !empty($date)&& !empty($author)&& !empty($mini_img)){
  12. if ($num_title <= 68){
  13. $result = mysql_query("INSERT INTO base (cat,title,meta_d,meta_k,description,text,date,author,mini_img,views) VALUES ('$category','$title','$meta_d','$meta_k','$description','$text','$date','$author','$mini_img','0')");

(Отредактировано автором: 26 Июня, 2010 - 14:24:25)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2010 - 15:07:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




maroz89 пишет:
сделал... и не удивился папка то создается, но не там где нужно, а в папке "админ", а нужно в папке сайта! я так понял путь задан не правельно

Не понял Серьёзно, создаётся? И при том не (например) /home/phpblog/www/files/$path_dir/ ? Или это не ошибка и вам реально надо работать с директорией долларpath_dir? Тогда извините, думал, это ошибка, и нужна директория по значению этой переменной...

maroz89 пишет:
как можно задать так, чтоб не указывать папку home! чтоб при переносе на сервер не менять, ведь корневая папка на севере может назваться по-разному к примеру html и тд...

работать с локальной ФС, относительно скрипта. Т.е. mkdir("files/"); - создать в этой директории папку files.
Или объявлять абсолютное местоположение корня с помощью константы и обращаться к этой константе.

А по вопросу, куда девалось оригинальное имя файла - а оно вообще пришло? И если пришло, то в каком виде?

Кстати, зачем в строке 4 "&& $_FILES['userfile']['size'] < 1024*1*1024"? Если это первая загрузка за сегодня и файл меньше 1мб, то создать папку, но в любом случае загрузить файл в эту папку (возможно, не созданную)?

И более классическая проблема - права на запись-то есть в директорию?

(Отредактировано автором: 26 Июня, 2010 - 15:09:34)



-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 26 Июня, 2010 - 17:08:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




maroz89 пишет:
При попытке загрузить файл, деректория не создается, картинка соотвественно не грузится
Если у вас в PHP-скрипте не создается определенная директория то вероятно у вас нет прав записи в родительскую папку - учтите что PHP-скрипт выполняется не от имени вашего системного пользователя которому скорее всего принадлежит данная папка а от имени www-data - поэтому проверьте чтобы на нее стояли права 777 Также проверьте правильность относительного пути - если на хостинге не установлена опция open_basedir то слеш / в начале пути будет означать абсолютный путь - а не аналогичный виртуальному пути web-пространства
Если вы хотите сделать PHP-скрипт без использования реальный относительный путей и незасимого от реальный абсолютных путей - например по причине использования функции chdir которая меняет рабочую папку внутри исполняемого PHP-скрипта - то можете использовать переменную окружения DOCUMENT_ROOT и далее часть абсолютного пути до вашего PHP-скрипта
Что касается отсутствия самого имени файла при запись в БД - то обязательно экранируйте все переменные при подстановке в SQL-запрос


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
maroz89
Отправлено: 27 Июня, 2010 - 11:59:16
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




ну с каталогом разобрался
JustUserR спасибо.. DOCUMENT_ROOT помогло
с записью в БД тоже все ясно... ему просто нечего записывать
Осталась одно проблемма - файл не грузитсяНедовольство, огорчение
вот немного переписал код
CODE (htmlphp):
скопировать код в буфер обмена
  1. if ($_FILES['userfile']['size'] < 1024*1*1024)
  2. {$date_dir = date('Ymd');
  3. $path_dir = $_SERVER['DOCUMENT_ROOT']."/files/".$date_dir;
  4.  
  5.   if (!is_dir($path_dir))
  6. {mkdir($path_dir, 0777);}
  7.  
  8.   if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  9.     move_uploaded_file($_FILES['userfile']['tmp_name'], '$path_dir');
  10.      }}
  11. $mini_img ="files/".$date_dir."/".$_FILES['userfile']['name'];
  12.  
  13. if (!empty($category) && !empty($title) && !empty($meta_d)&& !empty($meta_k)&& !empty($description)&& !empty($text)&& !empty($date)&& !empty($author)&& !empty($mini_img)){
  14. if ($num_title <= 68){
  15. $result = mysql_query("INSERT INTO base (cat,title,meta_d,meta_k,description,text,date,author,mini_img,views) VALUES ('$category','$title','$meta_d','$meta_k','$description','$text','$date','$author','$mini_img','0')");
  16. if($result='true')


Пробовал делать так
CODE (htmlphp):
скопировать код в буфер обмена
  1. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  2. print "ППППп";
  3.      move_uploaded_file($_FILES['userfile']['tmp_name'], '$path_dir');
  4.       }}

Для того что б узнать... не грузится файл или он не перемещается с временной папки...
Ну вот оказалось что не грузится
По поводу прав, ну папку в скрипте создаю с правами 777! работаю на локально компьютере (Денвер)! Где можно изменить права на запись?
 
 Top
JustUserR
Отправлено: 27 Июня, 2010 - 12:43:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




maroz89 пишет:
Ну с каталогом разобрался
JustUserR спасибо.. DOCUMENT_ROOT помогло
Пожалуйста! Использование данной переменной окружения особенно полезно тем что всегда показывает реальный абсолютный файловый путь - в отличие от многих других которые могут показывать web-пути или относительные open_basedir пути - и для превращения которых в настоящие абсолютные пути требуется доступ к конфигурационным файлам и просмотр их директив
maroz89 пишет:
Ну вот оказалось что не грузится
В таком случае попробуйте сделать print_r($_FILES) и посмотреть что выдаст данная конструкция - если массив файлов пуст то на самом деле у вас ничего не загружается - причем условие размера файла срабатывает поскольку значение null в проверочном условии трактуется как числовой ноль Попробуйте проверить правильность отправочной формы - а именно обязательная POST-отправка и указания Content-encoding путем аттбирута enctype="multipart/form-data"


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
maroz89
Отправлено: 28 Июня, 2010 - 01:54:38
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




JustUserR пишет:
Попробуйте проверить правильность отправочной формы - а именно обязательная POST-отправка и указания Content-encoding путем аттбирута enctype="multipart/form-data"

Да к своему стыду)) пропустил enctype="multipart/form-data"
Дописал, теперь имя файла нормально вводится, все как нужно...
CODE (htmlphp):
скопировать код в буфер обмена
  1. files/20100628/man_82.jpg

но файл всеравно не создается..
пробовал писать print_r($_FILES), получил такое

Array ( [userfile] => Array ( [name] => man_82.jpg [type] => [tmp_name] => [error] => 2 [size] => 0 ) )

(Отредактировано автором: 28 Июня, 2010 - 01:55:52)

 
 Top
JustUserR
Отправлено: 28 Июня, 2010 - 14:59:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




maroz89 пишет:
Дописал, теперь имя файла нормально вводится, все как нужно...
Но файл всеравно не создается.. пробовал писать print_r($_FILES), получил такое
После внесения последних изменений стало видно что файл начинает передаваться от браузера к PHP-интерпретатору и как минимум сопутствующие HTTP-заголовки успешно передаются - однако PHP не может или целиком получить файл или сохранить его во временную папку Однако в вашем случае видно что возникла ошибка с номером 2 что соответствует константе UPLOAD_ERR_FORM_SIZE - то есть
Цитата:
Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме
То есть вам следует убрать аттрибут тега input type="file" который ограничивает максимальный размер файла - в силу того что различные браузеры обрабатывают его по разному и использовать его не рекоммендуется Также на всякий случай проверьте максимально допустимый размер закачиваемого файла в php.ini для вашей инстнации PHP-интерпретатора
Если указанные выше действия не помогли окончательно разрегить проблему то имеет смысл посмотреть что реально преедается от браузера к web-серверу - для этих целей можно использовать HTTP-сниффер типа Proxymotron


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
maroz89
Отправлено: 28 Июня, 2010 - 20:04:12
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Такая ситуация... файл успешно перемещается, но не туда куда нужно, а в папку Админ, где лежит обработчик и форма...При этом файл называется $path_dir и у него нет разширения!
Когда убираю кавычки '$path_dir'

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  2.     move_uploaded_file($_FILES['userfile']['tmp_name'], $path_dir);

Получаю такое!
Цитата:
Warning: move_uploaded_file(X:/home/phpblog/www/files/20100628) [function.move-uploaded-file]: failed to open stream: Permission denied in X:\home\phpblog\www\admin\new_add.php on line 63

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'X:\tmp\php13E.tmp' to 'X:/home/phpblog/www/files/20100628' in X:\home\phpblog\www\admin\new_add.php on line 63

я так понимаю какиет-то проблеммы с правами... Где эти права на локальном компе править?

сделал так
CODE (htmlphp):
скопировать код в буфер обмена
  1. if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  2.      move_uploaded_file($_FILES['userfile']['tmp_name'],  "\home\phpblog\www\files\20100628");


файл теперь перемещается в корневую папку сайта, не имеет разширения и получает имя filesЃ00628
 
 Top
Мелкий Супермодератор
Отправлено: 28 Июня, 2010 - 20:29:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




maroz89 пишет:
При этом файл называется $path_dir и у него нет разширения!

О чём, в том числе, я и говорю, собственно.

maroz89 пишет:
файл теперь перемещается в корневую папку сайта, не имеет разширения и получает имя filesЃ00628

А вот тут строку надо брать в одинарные кавычки, т.к. сейчас \201 подхватывается как код символа, о чем и подсветка форума предупреждает.

maroz89 пишет:
я так понимаю какиет-то проблеммы с правами... Где эти права на локальном компе править?

Под виндой - честно, не представляю. Но поэкспериментируйте со вторым параметром функции mkdir


-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 29 Июня, 2010 - 16:00:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




maroz89 пишет:
Я так понимаю какиет-то проблеммы с правами... Где эти права на локальном компе править?
Система прав пользователей и их доступа к файлам в операционных системах NT в принципе похоже на аналогичную в linux - и если вы запускаете ваш сервис не из-под администраторского пользователя то такое вполне может быть - если в проводнике в Свойствх папки по вкладке Вид выключить флажок Использовать простой доступ к файлам - то при запросе аттрибутов любого каталога или файла вы увидете вполне мощный интерфейс для указания того какие пользователи имеют права к каким файлам и даже могут ли они передавать и переназначать права Попробуйте поставить достаточные права пользователю Гость который является неким аналогом пользователя nobody под linux - или же сделайте группу пользователей в которую будет входить владалец папки и пользователи от имени которого запускаются подпроцессы в Apache
Что касается использование слешей по интерпретатор PHP в целях совместимости между пратформами позволяет всегда использовать прямые слеши - поскольку обратные всегда приходится экранировать Также обратите внимание на то что все строковые константы с именем папки должны быть в кодировке Windows-1251 - то есть по сути кодировки имен файлов в ФС windows


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
maroz89
Отправлено: 30 Июня, 2010 - 09:31:10
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




причин этого чуда 2.. оказвается я не един с этой проблеммойУлыбка
Первая это то, то у меня Винда СП3 и в атрибутах каждой папки стоит Read Only и эту галочку убрать не возможно! тоесть она убирается, а после повторной проверки опять стоит((
Есть мнеие,
Цитата:
абсолютно с этим не связано.
пропиши session.save_path на директорию, где будет храниться временной хлам.
проблема может быть с правами доступа к временной директории, но никак ни с этим параметром.

по второму мнению пробовал прописать абсолютный путь
session.save_path = "X:/tmp/"
Не помогло... а вот с галочкой рид онли ... никак не могу победить((

И еще волпрос, как сделать чтоб файл, который теоретически перемещается в папку, имел такое имя и разширение как на копьютере??

(Отредактировано автором: 30 Июня, 2010 - 10:43:02)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB