На хостинге рекомендуют заменить 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, спасибо за ответ.
Ненравится мнетэтот вариант с изменением прав, в том смысле, что мне придется каким-то образом менять права файла постоянно.

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

Значит наверное надо требовать от хостинга решить эту проблему.
 
Абсолютно до фени, какой именно функцией файл аплода будет перемещен в доступную область. Есть права на copy() - копируй себе в удовольствие. Если не работает - хостер должен предоставить любой работающий метод.
 
Вобще-то в любой документации по загрузке файлов на сервер всегда после загрузки файла на сервер в доступную область встречается конструкция, вида: 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()
 
После загруки фотографии, допустим по адресу: _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().
 
ты не хотел узнать, где move_uploaded_file используется.
ты хотел узнать, чем она от copy отличается.
впрочем, предъявлять такие требования к твоему интеллекту, чтобы ты помнил, о чём задавал вопрос - слишком строго.
 
Но когда я хочу посмотреть фотографию в полном размере _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, фотография записывается с правами 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"> просматривать можно. Пример я уже приводил, могу еще раз привести (т.е. ссылку оставить).
 
Автор оригинала: Гриша К.
А вот то что, при таком варианте фотография с правми 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, спасибо за разъяснение. Теперь я смысл понял.
Ну вроде во всем разобрался.
 
Сверху