Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   upload .PNG on the server (http://forum.oszone.net/showthread.php?t=47024)

Ginger 22-03-2005 17:50 309069

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 309082

А разве здесь не "!=" вместо "!==" писать надо??? Вроде в $_FILES['userfile']['type'] содержится как раз текст типа image/jpeg, то есть проверку надо производит с помощью знака "не равно", а не "не идентично", хотя вообщем то это наверно всё равно, в любом случае везде только строки, то есть переменная и строка одного типа, то есть остаётся только равно или не равно проверить......


Хотя если
Цитата:

pri chiom s univera ja spokojno zalivala. a iz biblioteki ne mogu
то дело не в коде, а в компьютерах, то есть с одного из двух разных компьютеров не получается загрузить
Или универ и библиотека имеется в виду два сервера-и на каждом данный код лежит??

Prisoner 23-03-2005 08:59 309230

Дело в том, что type означивается не сервером, но бродилкой в которой был означен диалог отправки файла. Т.о. это задача броузера. Вот тут и могут быть такого рода заморочки - с одного аплоадится, а с другого - нет. Рекомендую перейти на серверное определение типа файла: string mime_content_type (string filename).
P.S. Да, и применять эту функцию нужно к временному файлу - $_FILES['userfile']['tmpname'][$i]. А то другая информация - фикция.

Ginger 23-03-2005 19:05 309419

vadimiron
в данном случае "!==" придает больше уверености мне :)
и это совершенно не влияет на работу скрипта. потому как все остальные типы указанные в скрипте определяются корректно.

Prisoner
это именно то, что я сама подумала :)
и про браузеры и про функцию mime_content_type
спасибо, что просвятил

Ginger 03-04-2005 17:19 312551

Prisoner
неудача.
сервер не сконфигурирован использовать mime_content_type
на локалке я попыталась его установить,
но оказалось, что он вобще кроме gif ничего не распознаёт...

как проблему решить-то?

Prisoner 04-04-2005 07:35 312644

Странно. Это стандартное расширение. Там заморочки с нахождением 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'ов, но думаю, сойдет и тут. А тут интересные грабли с mime_content_type. Может она заработает, с ней как-то приятнее дело иметь :).

Ginger 04-04-2005 15:24 312763

Prisoner
да дело в том, что на сервере mime_content_type не работает.
скорее всего там не сконфигурирован php.ini

кстати, я создала текстовый документ, непечатала тем пару строк
переименовала в pic.png и ($_FILES['userfile']['type'][$i] !== 'image/png') нормально его опознал.
а реальнуй рисунок не хочет...
может png надо как-то по другому опознавать?

Prisoner 04-04-2005 18:01 312799

В функции вызов mime_content_type - это страховка. Основной упор сделан на разбор заголовочной информации. И вот если после разбора этой инфы по типу ничего нет, то вызывается страховка. Попробуй, вдруг заработает? Может быть при открытии файлв его тип определяется иначе, не как функцией mime_content_type (хоть и маловероятно). В любом случае можно только посоветовать пнуть серверодержателя - хостера или кто там у вас в универе... это самое верное решение, остальное - финты ушами.

Ginger 04-04-2005 21:06 312858

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;
}

Ginger 04-04-2005 21:07 312859

Prisoner
ладно.. попрошу что б включили функцию...

Prisoner 04-04-2005 21:50 312869

На случай если тебе не пойдут на встречу можно попробовать такой код:
Код:

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

Stek 05-04-2005 21:56 313187

Как понимаю необходимо заливать на сервер файлы определенного типа.
Так вот, советую не напрягать админа с включением сторонней библиотеки, так как вам это кроме экономии 3 строк кода ничего не даст, а админу и так есть чем занятся :)

1. Берете ОРИГИНАЛЬНОЕ имя файла и выдираете из него расширение.
2. по расширению и смотрите на разрешенные :)

Предусматривая вопросы сразу же отвечаю
- даже и mime модулем, я могу вам послать txt как архив. Он хака это вас не спасет
- закаченный под неправильным типом файл, сервером так же и отдается. Закаченный как txt скрипт php, будет отдан как текст, а не выполнен сервером. Тут хак так же исключается.

Если файл прислан под видом картинки, пустите на него getimagesize() - и получите правильный ответ, картинка ли это или нет, и что за картинка.

Imperio 05-04-2005 22:15 313193

Ginger
Цитата:

ладно.. попрошу что б включили функцию...
У многих хостеров прокатывает такая штука, если в паблик положить php.ini с нужными параметрами - все работает.

Ginger 05-04-2005 22:19 313195

Stek
Цитата:

Так вот, советую не напрягать админа с включением сторонней библиотеки
не каждому повезёт работать на любимой работе...
Цитата:

кроме экономии 3 строк
ну далеко не 3-ёх..

т.е. предлагаете изменить скрипт в принципе?
ну ок. остаётся только согласиться

Ginger 05-04-2005 22:22 313198

Imperio
да там возможно нужно менять расположение файла magic на самом сервере...

Stek 05-04-2005 23:56 313210

на вскидку
PHP код:

<?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');
}
?>



Время: 11:10.

Время: 11:10.
© OSzone.net 2001-