Показать полную графическую версию : upload .PNG on the server
скрипт на PHP.
загружает файлы на сервер.
код:
elseif (
($_FILES['userfile']['type'][$i] !== 'image/png') &&
($_FILES['userfile']['type'][$i] !== 'image/bmp') &&
($_FILES['userfile']['type'][$i] !== 'image/gif') &&
($_FILES['userfile']['type'][$i] !== 'image/jpeg') &&
($_FILES['userfile']['type'][$i] !== 'image/pjpeg') &&
($_FILES['userfile']['type'][$i] !== 'text/plain') &&
($_FILES['userfile']['type'][$i] !== 'application/x-rar-compressed') &&
($_FILES['userfile']['type'][$i] !== 'application/x-zip-compressed') &&
($_FILES['userfile']['type'][$i] !== 'application/zip') )
{ $con=$con+$i;
$msg .= '<p>'.$con.' - Tip fajla ne razreshion</p>';}
не даёт залить PNG.
при чём из университета я могла залить, а из библиотеки нет
vadimiron
22-03-2005, 19:24
А разве здесь не "!=" вместо "!==" писать надо??? Вроде в $_FILES['userfile']['type'] содержится как раз текст типа image/jpeg, то есть проверку надо производит с помощью знака "не равно", а не "не идентично", хотя вообщем то это наверно всё равно, в любом случае везде только строки, то есть переменная и строка одного типа, то есть остаётся только равно или не равно проверить......
Хотя если
pri chiom s univera ja spokojno zalivala. a iz biblioteki ne mogu
то дело не в коде, а в компьютерах, то есть с одного из двух разных компьютеров не получается загрузить
Или универ и библиотека имеется в виду два сервера-и на каждом данный код лежит??
Prisoner
23-03-2005, 08:59
Дело в том, что type означивается не сервером, но бродилкой в которой был означен диалог отправки файла. Т.о. это задача броузера. Вот тут и могут быть такого рода заморочки - с одного аплоадится, а с другого - нет. Рекомендую перейти на серверное определение типа файла: string mime_content_type (string filename).
P.S. Да, и применять эту функцию нужно к временному файлу - $_FILES['userfile']['tmpname'][$i]. А то другая информация - фикция.
vadimiron
в данном случае "!==" придает больше уверености мне :)
и это совершенно не влияет на работу скрипта. потому как все остальные типы указанные в скрипте определяются корректно.
Prisoner
это именно то, что я сама подумала :)
и про браузеры и про функцию mime_content_type
спасибо, что просвятил
Prisoner
неудача.
сервер не сконфигурирован использовать mime_content_type
на локалке я попыталась его установить,
но оказалось, что он вобще кроме gif ничего не распознаёт...
как проблему решить-то?
Prisoner
04-04-2005, 07:35
Странно. Это стандартное расширение. Там заморочки с нахождением magic.mime. Можно финт ушами: есть переменная $http_response_header которая означивается после операции fopen и которую можно разобрать:
function GetHeaders($URL)
{
$Headers = array();
$F = @fopen ($URL, 'r');
@fclose($F);
$Headers['Error'] = array();
//var_dump($http_response_header);
foreach($http_response_header as $HItem)
{
if (strpos($HItem, 'Content-Length: ') !== false)
$Headers['Content-Length'] = substr($HItem, 16);
if (strpos($HItem, 'Not Found') !== false)
$Headers['Error']['404'] = 'Объект не найден. Ложная ссылка. (Ошибка #404)';
if (strpos($HItem, 'Date: ') !== false)
$Headers['Date'] = substr($HItem, 6);
if (strpos($HItem, 'Server: ') !== false)
$Headers['Server'] = substr($HItem, 8);
if (strpos($HItem, 'Content-Type: ') !== false)
$Headers['Mime'] = substr($HItem, 14);
}
if (!isset($Headers['Mime']))
$Headers['Mime'] = '';
else
{
if (!preg_match('/([\w]+\/[\w]+)/i', $Headers['Mime'], $Match))
$Headers['Mime'] = @mime_content_type($URL);
else
$Headers['Mime'] = $Match[1];
}
return $Headers;
}
Делалось когда-то для url'ов, но думаю, сойдет и тут. А тут (http://ru.php.net/manual/en/function.mime-content-type.php) интересные грабли с mime_content_type. Может она заработает, с ней как-то приятнее дело иметь :).
Prisoner
да дело в том, что на сервере mime_content_type не работает.
скорее всего там не сконфигурирован php.ini
кстати, я создала текстовый документ, непечатала тем пару строк
переименовала в pic.png и ($_FILES['userfile']['type'][$i] !== 'image/png') нормально его опознал.
а реальнуй рисунок не хочет...
может png надо как-то по другому опознавать?
Prisoner
04-04-2005, 18:01
В функции вызов mime_content_type - это страховка. Основной упор сделан на разбор заголовочной информации. И вот если после разбора этой инфы по типу ничего нет, то вызывается страховка. Попробуй, вдруг заработает? Может быть при открытии файлв его тип определяется иначе, не как функцией mime_content_type (хоть и маловероятно). В любом случае можно только посоветовать пнуть серверодержателя - хостера или кто там у вас в универе... это самое верное решение, остальное - финты ушами.
Prisoner
sorry, я невнимательно посмотрела код...
мне тут вобщем нужно только пару строк:
function GetHeaders($URL)
{
$Headers = array();
$F = @fopen ($URL, 'r');
@fclose($F);
$Headers['Error'] = array();
//var_dump($http_response_header); - не понимаю предназначаение этой строки
foreach($http_response_header as $HItem)
{
if (strpos($HItem, 'Content-Type: ') !== false)
$Headers['Mime'] = substr($HItem, 14);
}
if (!isset($Headers['Mime']))
$Headers['Mime'] = '';
else
{
if (!preg_match('/([\w]+\/[\w]+)/i', $Headers['Mime'], $Match))
$Headers['Mime'] = @mime_content_type($URL); - это строка тоже врядли нужна, если эта функция всё рано отключена
else
$Headers['Mime'] = $Match[1];
}
return $Headers;
}
Prisoner
ладно.. попрошу что б включили функцию...
Prisoner
04-04-2005, 21:50
На случай если тебе не пойдут на встречу можно попробовать такой код:
function GetMIME($File)
{
$F = @fopen ($File, 'r');
@fclose($F);
foreach($http_response_header as $HItem)
if (strpos($HItem, 'Content-Type: ') !== false)
$MIME = substr($HItem, 14);
return $MIME;
}
void var_dump (mixed expression [, mixed expression [, ...]]) - дамп информации о переменной. Эта строка закоментирована. Просто когда я писал эту функцию, я выводил дамп переменной чтобы понять что она за зверь - формат-то плавающий, потому и страховки. Удачи.
Как понимаю необходимо заливать на сервер файлы определенного типа.
Так вот, советую не напрягать админа с включением сторонней библиотеки, так как вам это кроме экономии 3 строк кода ничего не даст, а админу и так есть чем занятся :)
1. Берете ОРИГИНАЛЬНОЕ имя файла и выдираете из него расширение.
2. по расширению и смотрите на разрешенные :)
Предусматривая вопросы сразу же отвечаю
- даже и mime модулем, я могу вам послать txt как архив. Он хака это вас не спасет
- закаченный под неправильным типом файл, сервером так же и отдается. Закаченный как txt скрипт php, будет отдан как текст, а не выполнен сервером. Тут хак так же исключается.
Если файл прислан под видом картинки, пустите на него getimagesize() - и получите правильный ответ, картинка ли это или нет, и что за картинка.
Ginger ладно.. попрошу что б включили функцию...
У многих хостеров прокатывает такая штука, если в паблик положить php.ini с нужными параметрами - все работает.
Stek
Так вот, советую не напрягать админа с включением сторонней библиотеки
не каждому повезёт работать на любимой работе...
кроме экономии 3 строк
ну далеко не 3-ёх..
т.е. предлагаете изменить скрипт в принципе?
ну ок. остаётся только согласиться
Imperio
да там возможно нужно менять расположение файла magic на самом сервере...
на вскидку
<?php
$allowed = array('zip','rar','gz','txt','jpg','gif','png');
$ext = strtolower(substr(strrchr($url, "."), 1));
if (false == in_array($ext, $allowed)) {
die('File exstension failed');
}
?>
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.