На хостинге рекомендуют заменить move_uploaded_file(), на copy(). Это нормально?

Гриша К.

Новичок
На хостинге рекомендуют заменить move_uploaded_file(), на copy(). Это нормально?

Здравствуйте.
На хостинге (Apache 1.3.33 (Unix), PHP 4.3.9), га 2-х аккаунтах размещено 2 копии сайта (для тестирования), на одном все работает нормально, на другом есть такие проблемы:

Есть скрипт для загрузки изображенией на сайт (в кратце):

PHP:
if (is_uploaded_file($userfile)) {
	/* Проверка результата загрузки файла */
     	elseif (!move_uploaded_file($userfile, $upfile)) {
        		echo 'Файл не загружен';
	}
	else {
        		echo 'Файл загружен';
	}
}
После загруки фотографии, допустим по адресу: _http://site.ru/photo/1.jpg
- При открытии фотографии по указанному адресу, выводится сообщение об ошибке 403, о том, что нет прав для доступа к просмотру фотографии.
- При отображении фотографии таким образом: <img href="../photo/1.jpg">, она отображается нормально.

На хостинге рекомендуют следующее:
Проблема в том, что скорее всего при закачке картинки скрипт использует
функцию move_uploaded_file(). Вместо нее нужно использовать copy().
Нормальны ли это? Всетаки на http://ru.php.net/manual/ru/features.file-upload.php, рекомендуют использовать move_uploaded_file().
И на другом аккаунте на этом же хостинге, все работает с move_uploaded_file().
 

Popoff

popoff.donetsk.ua
Гриша К.
Не нормально.
Попробуй выставить вручную права на файл после того, как ты его переместил.
 

Гриша К.

Новичок
Popoff, спасибо за ответ.
Ненравится мнетэтот вариант с изменением прав, в том смысле, что мне придется каким-то образом менять права файла постоянно.

Я забыл написать о том, что если я данный файл фотографии перемещу к себе на компьютер по ftp, а потом перемещу обратно, то все будет нормально.

Значит наверное надо требовать от хостинга решить эту проблему.
 

DiMA

php.spb.ru
Команда форума
Абсолютно до фени, какой именно функцией файл аплода будет перемещен в доступную область. Есть права на copy() - копируй себе в удовольствие. Если не работает - хостер должен предоставить любой работающий метод.
 

Savage

Новичок
Вобще-то в любой документации по загрузке файлов на сервер всегда после загрузки файла на сервер в доступную область встречается конструкция, вида: chmod($path, 0666) - т.е. просто УСТАНАВЛИВАЕТСЯ необходимый атрибут файла - смотря для чего он будет использоваться - чтобы в дальнейшем с его работой не было проблем.

А по поводу использовать: move_uploaded_file() или copy() - это действительно по барабану, т.к. move - гарантированно удалит временный файл, а copy - только копирует, но в любом случае временный файл будет удален самим сервером, т.к. этот файл существует только во время выполнения запроса при загрузке файлов
 

Гриша К.

Новичок
DiMA, спасибо за ответ.
Теперь несколько тяжело разобраться в выборе того,с тоит ли воспользоваться советом провайдера или стоит, тербовать с него сделать права на функцию move_uploaded_file().
На другом аккаунте того же хостинга так и сделано.

-~{}~ 19.05.06 11:35:

Savage, спасибо за пояснения и за конструкцию chmod($path, 0666), попробую ее.
Возможно тогда на самом деле нет особой разницы между move_uploaded_file() или copy()
 

Andreika

"PHP for nubies" reader
После загруки фотографии, допустим по адресу: _http://site.ru/photo/1.jpg
- При открытии фотографии по указанному адресу, выводится сообщение об ошибке 403, о том, что нет прав для доступа к просмотру фотографии.
- При отображении фотографии таким образом: <img href="../photo/1.jpg">, она отображается нормально.


маразъм крепчал... а ты пути не путаешь?
 

Гриша К.

Новичок
Andreika, спасибо за ответ,
Я так написал, потому что файл отображающий фотографию, находится в папке /user/myphoto.php и соответсвенно для вывода я использую <img href="../photo/1.jpg"> (надо было конечно сразу нормально указать путь, но это просто пример).
Я при таком варианте к примеру (в данном случае я вывожу уменьшенный размер) <img href="photo/1.jpg" width="100" height="100"> фотография отображается.
Но когда я хочу посмотреть фотографию в полном размере _http://site.ru/photo/1.jpg, то выводится сообщение об ошибке 403.

Фанат, спасибо за ответ.
Я конечно сначала зашел на php.net и почитал про эти функции.
Но там же есть еще раздел загрузка файлов: http://ru.php.net/manual/ru/features.file-upload.php, где приводится пример загрузки файлов (так же и в книге у меня написано), там используется функция move_uploaded_file().
 

Фанат

oncle terrible
Команда форума
ты не хотел узнать, где move_uploaded_file используется.
ты хотел узнать, чем она от copy отличается.
впрочем, предъявлять такие требования к твоему интеллекту, чтобы ты помнил, о чём задавал вопрос - слишком строго.
 

kruglov

Новичок
Но когда я хочу посмотреть фотографию в полном размере _http://site.ru/photo/1.jpg, то выводится сообщение об ошибке 403.
Сервер получает от браузера полный адрес и выдает результат.
Стало быть, ему глубоко пофих, как вы смотрите картинку, вставив ее в страницу или вызвав браузером непосредственно (если только вы referer не проверяете).

Поэтому врожденное чувство такта не позволяет мне дальше распространяться о проблеме.
 

Гриша К.

Новичок
Я забыл, что у меня не такой путь к фотографии используется <img src="photo/1.jpg"> (попутал href), а путь фотографии передается GET'ом в скрипт который ее уменьшает, <img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62">
Согласен, что объяснения мои были частично неверные.

И в первом варианте действительно фотография не отображается, а во втором отображается. Вот это меня и запутало, при таком варианте показывате, а в остальных нет.
Посмотрите пожалуйста пример:
// пример уже удалил!
 

Andreika

"PHP for nubies" reader
зайди на фтп и выставь все права к этой картинке и попробуй еще раз ее открыть
 

Гриша К.

Новичок
Andreika, фотография записывается с правами 600. Поменял на 644 и она отображется.

При сипользовании функции copy() вместо move_uploaded_file() фотографии сразу записываются с правами 644.

Так как знаний в програмировании у меня мало (я всетаки не программист, а так скажем мне приходится исполнять обязанности программиста), то когда на хостинге мне написали, что надо использовать copy() вместо move_uploaded_file(), а на php.net в разделе загрузка файлов, описан пример с move_uploaded_file(), я решил зайти на форум phpclub'а и узнать, нормально ли это.

Значит буду использовать функцию copy().

А вот то что, при таком варианте фотография с правми 600 <img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62"> - отображается,
а при такой нет <img src="photo/1.jpg">, это я не понил.

-~{}~ 19.05.06 17:49:

Я еще попробовал использовать функцию chmod($upfile, 0644), в сочетании move_uploaded_file().
Буду использовать такой вариант.
 

фриман

Новичок
А вот то что, при таком варианте фотография с правми 600 <img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62"> - отображается,
а при такой нет <img src="photo/1.jpg">, это я не понил.
-------------------

Здесь только права могут быть виноваты.
 

Гриша К.

Новичок
фриман, спасибо аз ответ.
Но вот когда я закачиваю фотографию с правами 600 (т.е. просматривать вроде нельзя), то именно при таком варианте <img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62"> просматривать можно. Пример я уже приводил, могу еще раз привести (т.е. ссылку оставить).
 

Igor2001

Новичок
Автор оригинала: Гриша К.
А вот то что, при таком варианте фотография с правми 600 <img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62"> - отображается,
а при такой нет <img src="photo/1.jpg">, это я не понил.
<img src="/resize_image.php?image=photo/1.jpg&max_width=80&max_height=62"> - тут ты запускаешь php-скрипт, и изображение показывается скриптом... смотри кто владелец файла и от кого запускаются скрипты и под кем работает апач.
 

Гриша К.

Новичок
Igor2001, спасибо за разъяснение. Теперь я смысл понял.
Ну вроде во всем разобрался.
 
Сверху