[PHP] file upload

uncle17


if (is_uploaded_file($art_img
{
db_conn;
$array=explode(".",$art_img_name);
$extension=$array[sizeof($array)-1];
if($extension=="jpg" || $extension=="jpeg") {$mimeName = "JPEG Image"; $art_img_type="image/jpeg";}
if($extension=="gif") {$mimeName = "GIF Image"; $art_img_type="image/gif";}
// по этот момент всё ОК


// Open the uploaded file
$file = fopen($art_img, "r");
// Read in the uploaded file
$fileContents = fread($file, filesize($art_img;
// Escape special characters in the file
$fileContents = AddSlashes($fileContents);
if($is_main=="on"){$is_main=1;} else {$is_main=0;}
$insertQuery = "INSERT INTO art_files VALUES (NULL, NULL, \"{$alttext}\", \"{$art_img_type}\", \"{$mimeName}\", \"{$fileContents}\", $is_main)";
mysql_query($insertQuery);
}
$fileContents считывается неправильно, $insertQuery не заполняется вообще. Помогите найти ошибку...

sergey_m

if (is_uploaded_file($art_img
{
db_conn;
$array=explode(".",$art_img_name);
А вообще ошибок много.

uncle17

здесь-то как раз всё нормально - так и нужно... Как бы сделать всё остальное...

sergey_m

Так и должно быть, что параметр называется одним словом, а данные ты берешь из другой переменной?

uncle17

Именно... аплоад так и работает. Ну, можно обратиться к $HTTP_POST_VARS, но register_globals=on

artimon

$file = fopen($art_img, "rb");

uncle17

с чего б? Не бывает такого...

artimon

Бывает.
Или используй file_get_contents

stalker33rus10

1) А как ты узнаешь что $fileContents считывается неправильно? В чем неправильность?
2) $insertQuery не заполняется вообще - ну это может быть у тебя запрос неправильный, в таблице к примеру поля перепутал или тип не тот, у тебя же в запросе явно не указано, в какие поля пишется.
3) Конечно лучше бы если было через $_FILES, я бы мог на своем хостинге посмотреть где register_globals=off
4) Просто совет - если ты действительно хочешь определить именно тип файла (*.jpg - я так любой файл назвать могу) - юзай GetImageSize.

artimon

И вообще, идея хранить файл в базе порочна.

stalker33rus10

Целиком и полностью поддерживаю!

uncle17

A list of possible modes for fopen using mode
mode Description
'r' Open for reading only; place the file pointer at the beginning of the file.
'r+' Open for reading and writing; place the file pointer at the beginning of the file.
'w' Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
'w+' Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it.
'a' Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
'a+' Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
'x' Create and open for writing only; place the file pointer at the beginning of the file. If the file already exists, the fopen call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.
'x+' Create and open for reading and writing; place the file pointer at the beginning of the file. If the file already exists, the fopen call will fail by returning FALSE and generating an error of level E_WARNING. If the file does not exist, attempt to create it. This is equivalent to specifying O_EXCL|O_CREAT flags for the underlying open(2) system call. This option is supported in PHP 4.3.2 and later, and only works for local files.
А за совет спасибо - посмотрю.

Dasar

> И вообще, идея хранить файл в базе порочна.
Почему? Где его еще хранить?

uncle17

1) Дык вывожу на экран элементарно:)
2) $insertQuery=NULL в этом скрипте. О выполнении запроса пока речи не идет.
3) Да пофиг...
4) Тоже тема

uncle17

поясни

uncle17

в файлах...

stalker33rus10

хм... ща попробую посмотреть.
$insertQuery=NULL в этом скрипте
вот это мне непонятно.
Кстати по поводу regiter_globals, хотя тема сто раз и обсуждалась, - я тоже раньше думал что пофиг, но вот как-то пришлось переносить скрипты на хостинг где register_globals=off... По-моему сразу лучше под это писать

Dasar

> в файлах...
какие при этом появляются плюсы?

artimon

Читай Note после этой таблицы.

artimon

1) Дык вывожу на экран элементарно:)
Бинарный файл?!

uncle17

Ну, переносить мне ничего не придется - сервер физический наш, а когда мы таки решим перевести (вдруг) всё на register_globals=off, думаю, я уже в этой конторе работать не буду:)
Насчет $insertQuery - вот и мне непонятно:(

evgen5555

Типа, перекачка файла по каналам БД - это уже некисло. Например, если база не на одном компе с серваком стоит.

uncle17

да по барабану... всё зависит от количества файлов имхо. Ну а мы вот решили не создавать кучу мелких файлов на винте, а хранить всё в одной базе и не мучаться

uncle17

угу... прочитал... сенькс

artimon

1. Файлы обычно большие, нафига хранить в базе лишнее?
2. Что б отдать юзеру файл, достаточно посмотреть в базе имя этого файла и отдать ссылку на него. Что б отдать файл из базы нужно его из базы достать, отстрипать слеши и отдавать скриптом. Лишняя нагрузка и на базу и на сервер.

uncle17

там addslashes стоит, так что не вижу в этом проблемы

artimon

Чем он помогает, когда на экран выводится символ \0 или \r ?

stalker33rus10

Ты знаешь...
Вывел я на экран бинарный файл, но вот утверждать, правильно он отобразился или нет я утверждать не смею

uncle17

да и пусть выводится...

stalker33rus10

Вот в чем прикол - когда я вывожу jpg таким образом даже после addslashes не передав при этом ничего, он мне пытается этот jpg отобразить
дело говорит - addslashes здесь не пмогут.

artimon

К тому же отдачей просто файлов может заниматся отдельный, простой и быстрый сервер, типа mathopd или nginx.

uncle17

хм... мы тут давеча, когда думали, как лучше хранить, специально протестировали - 6 мегов картинок штук 300-350 сервер выдал из базы ПХП-скриптом за 0.6 миллисекунды. Это к вопросу о нагрузке...

Dasar

> 1. Файлы обычно большие, нафига хранить в базе лишнее?
на сайтах - обычно используются маленькие файлы (1-100 килобайт).
> Что б отдать файл из базы нужно его из базы достать, отстрипать слеши и отдавать скриптом. Лишняя нагрузка и на базу и на сервер.
Реальная разница только на передачу файла по каналам базы, т.к. все остальные операции:
чтение данных с диска, запись данных в http-поток и т.д. - все равно делаются и в том, и в другом случае.

sergey_m

Реальная разница только на передачу файла по каналам базы, т.к. все остальные операции:
чтение данных с диска, запись данных в http-поток и т.д. - все равно делаются и в том, и в другом случае.
Высокопроизводительные http сервера, работающие на высокопроизводительных ОС отсылают файлы с помощью системного вызова sendfile когда ядро ОС самостоятельно копирует файл в сокет, без копирования его в память процесса http сервера. Это позволяет отдавать тысячи объектов в секунду на скорости 100 Мбит/с. С базой такого никогда не получится.
Оставить комментарий
Имя или ник:
Комментарий: