Как переписать файл на сервер?№ 1
Автор: Красотка
Дата : 25-01-03, Сбт, 16:41:54

У меня есть следующий код:
<?
$ImgDir = "target";
@mkdir($ImgDir,666);

if(@$doUplоаd)
{
    if(file_exists( $File))
    {
      Copy( $File, "$ImgDir/".basename( $File_name ));
    }
}

?>

<body>
<form action=photo.php method=post>
<input type=file name=File>
<br>
<input type=submit name=doUplоаd value="Uplоаd">
</form>

</body>


Локально на моем домашнем компе это работает. Но когда я делаю то же самое на сервере, то файл не переписывается.
В чем проблема?? Если можете, помогите пожалуйста.
-----------------------------------
Красота - страшная сила
[ 25-01-03, Sat, 23:42:59 Отредактировано: Красотка ]
Профиль 

Как переписать файл на сервер?№ 2
Автор: Большой Грызь
Дата : 25-01-03, Сбт, 17:24:24

Хм...Красотка, это РНР или ASP (синтаксиса ASP не знаю - потому и спрашиваю)?

Если РНР, то uplоаded file копируется совсем другой функцией.
--------------------------------------------------------
Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Как переписать файл на сервер?№ 3
Автор: Красотка
Дата : 25-01-03, Сбт, 17:37:30

это РНР
Какой функцией?
-----------------------------------
Красота - страшная сила
[ 26-01-03, Sun, 1:21:50 Отредактировано: Красотка ]
Профиль 

Как переписать файл на сервер?№ 4
Автор: Большой Грызь
Дата : 26-01-03, Вск, 04:21:28

Я так понимаю тебе нужно загружать именно картинки. Я тебе кину сокращенный вариант того, как реализована загрузка картинок тут (сократил несколько проверок на правильность загружаемого файла). Для начала немного информации. Прежде всего форма должна быть определена вот так:
<form action=photo.php method=post enctype="multipart/form-data">

"enctype="multipart/form-data" " как раз говорит о том, чтобы данные из формы передавались в том виде, в котором может быть передана нетекстовая информация (например, файл). На домашнем сервере может у тебя и работало без этого, но в принципе это необходимо указывать.

Далее. При постировании используя РНР желательно также добавить спрятанную переменную MAX_FILE_SIZE, в которой нужно указать максимальный допустимый размер загружаемого файла (в байтах):

<input type="hidden" name="MAX_FILE_SIZE" value="400000">

В примере, который я привел, я заранее указываю заведомо бОльший размер, потому что настоящую проверку я делаю "вручную" - это позволяет выдать соответствующее предупреждение юзеру. У меня лично не получилось отловить тот случай, когда юзер пытается загрузить файл с размером больше, чем MAX_FILE_SIZE - страница просто "зависала". Именно поэтому я и указываю заведомо больший размер, чтобы проверить потом "вручную".

Теперь непосредственно о том, как в РНР обрабатывается загружаемый файл.
По идее самый надежный способ (особенно, когда загружаются несколько файлов) это использовать $HTTP_POST_FILES array. В частности в твоем примере тебе нужно использовать $HTTP_POST_FILES["File"], потому что в твоем примере поле загружаемого файла в форме называется "File". $HTTP_POST_FILES["File"] - это тоже array и он содержит следующие поля:

$HTTP_POST_FILES["File"]["name"] - оригинальное имя файла (то, какое оно было у клиента)
$HTTP_POST_FILES["File"]["tmp_name"] - полное имя временного файла (т.е. включая полный путь к файлу). При загрузке файл попадает во временную директорию, определенную в настройках РНР и получает временное имя.
$HTTP_POST_FILES["File"]["size"] - размер файла в байтах.

Есть, кажется, и еще поля, но в данном случае они не нужны.

В нижеприведенном примере я использую три функции:

1) HandleUplоаdImg () - создает директорию, указанную в $target (если она не существует), вызывает функцию CheckUplоаdImg () (см. ниже) для проверки легитимности загружаемого файла и затем вызывает РНР функцию
   move_uplоаded_file(<path_to_uplоаded_temporary_file>, <path_to_target_file> )
которая перемещает временный файл в нужное место.

2) CheckUplоаdImg () - проверяет легитимность загружаемого файла. Для начала проверяется расширение файла (допускаются лишь JPG,JPEG,GIF), затем вызывается CheckFileName (см. ниже) для проверки имени файла. Далее проверяется размер файла (переменная $img_max_size содержит максимальный размер загружаемого файла в байтах) и наконец проверяется тип и резолюция картинки. Последнее делается с помощью РНР функции GetImageSize($tmp_name) (не требует подключения GDI библиотеки) которая возвращает array, в котором тебя по сути должно интересовать лишь следующее:
$img_info[0] - ширина картинки в пикселях
$img_info[1] - высота картинки в пикселях
$img_info[2] - тип картинки (значения 1 и 2 - JPG и GIF)

3) CheckFileName ($name) - проверяет легитимность имени загружаемого файла (чтобы не было всяческих эксплоитов типа "../../autoexec.bat" )

А вот сам код:


<?PHP

$WarningStr = "";
$ImgDir = "target";
$img_max_size = 100000;
$img_max_x    = 600;
$img_max_y    = 600;

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function CheckFileName ($name)
{
    GLOBAL $WarningStr;
    if (strstr ($name, ".." ))
    {
       $WarningStr = "Неправильное имя файла!!!";
       return FALSE;
    }

    for ($i=0; $i < strlen($name); $i++)
       if (
            (($name{$i} < 'a' ) || ($name{$i} > 'z' )) &&
            (($name{$i} < 'A' ) || ($name{$i} > 'Z' )) &&
            (($name{$i} < '0' ) || ($name{$i} > '9' )) &&
             ($name{$i} != '.' ) && ($name{$i} != '_' ) && ($name{$i} != '-' )
          )
    {
       $WarningStr = "Неправильное имя файла (только латинские буквы и цифры)!!!";
       return FALSE;
    }

    return TRUE;
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function CheckUplоаdImg ()
{
    GLOBAL $HTTP_POST_FILES;
    GLOBAL $WarningStr;
    GLOBAL $img_max_size;
    GLOBAL $img_max_x;
    GLOBAL $img_max_y;

    $name    = $HTTP_POST_FILES["File"]["name"];
    $tmp_name = $HTTP_POST_FILES["File"]["tmp_name"];
    //--------------------------
    // Checking file extension
    //--------------------------
    $ext = strtoupper (substr(strrchr($name, "." ),1));
    if ( ($ext != "JPEG" ) && ($ext != "JPG" ) && ($ext != "GIF" ) )
    {
       $WarningStr = "Неправильный тип файла (".$ext." )!!!";
       return FALSE;
    }
    //--------------------------
    // Checking file name
    //--------------------------
    if (!CheckFileName ($name))
       return FALSE;

    //--------------------------
    // Checking file size
    //--------------------------
    if ($HTTP_POST_FILES["File"]["size"] > $img_max_size)
    {
       $WarningStr = "Размер файла не должен превышать ".($img_max_size/1000)."КБ!!!";
       return FALSE;
    }

    //--------------------------
    // Checking image dimensions & type
    //--------------------------

    $img_info = GetImageSize($tmp_name);
    if (!$img_info)
    {
       $WarningStr = "Ошибка чтения временного файла!!!";
       return FALSE;
    }
    if ( ($img_info[2] != 1) && ($img_info[2]!= 2) )
    {
       $WarningStr = "Неправильный тип файла!!!";
       return FALSE;
    }
    if ( ($img_info[0]>$img_max_x) || ($img_info[1]>$img_max_y) )
    {
       $WarningStr = "Размер картинки не должен превышать $img_max_x$img_max_y пикселей!!!";
       return FALSE;
    }
    return TRUE;
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
function HandleUplоаdImg ()
{
    GLOBAL $ImgDir;
    GLOBAL $HTTP_POST_FILES;
    GLOBAL $WarningStr;

    if (is_uplоаded_file($HTTP_POST_FILES["File"]["tmp_name"]))
    {
       //--------------------------------
       // create target dir if necessary
       //--------------------------------
       if (!is_dir($ImgDir))
       {
            if (!mkdir ($ImgDir, 0700))
            {
                $WarningStr = "Ошибка создания директории!!!";
                return FALSE;
            }
       }
      
       //--------------------------------
       // Check uplоаded file
       //--------------------------------
       if (!CheckUplоаdImg ())
            return FALSE;

       //--------------------------------
       // Move uplоаded file
       //--------------------------------
       move_uplоаded_file($HTTP_POST_FILES["File"]["tmp_name"], $ImgDir."/".$HTTP_POST_FILES["File"]["name"]);
    }
    else
    {
       $WarningStr = "Системная ошибка (возможная атака)!!!";
       return FALSE;
    }
    return TRUE;
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

if (array_key_exists ("File", $HTTP_POST_FILES))
    HandleUplоаdImg();

?>

<body>

<?PHP
if ($WarningStr != "" )
   print("<FONT COLOR=#FF0000><B>$WarningStr</B></FONT><BR><BR>\n" );
?>

<form action=photo.php method=post enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="400000">
<input type=file name=File>
<br>
<input type=submit name=doUplоаd value="Uplоаd">
</form>

</body>
--------------------------------------------------------
Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Как переписать файл на сервер?№ 5
Автор: Большой Грызь
Дата : 26-01-03, Вск, 09:37:02

Для тех, кто хочет воспользоваться приведенным кодом должен кое-что уточнить.
В строке $img_info = GetImageSize($tmp_name); идет обращение напрямую ко временному файлу. Но не на всех серверах разрешено такое обращение (скорее наоборот - в большинстве случаев доступ разрешен лишь к файлам, находящимся в директории юзера, а временная директория, куда попадают загружаемые файлы, находится совсем в другом месте). Есть два решения этой проблемы. Если у вас есть доступ к установкам сервера, то дайте РНР скриптам разрешение на доступ ко временной директории. Если же нет, то весь следующий кусок:


    //--------------------------
    // Checking image dimensions & type
    //--------------------------

    $img_info = GetImageSize($tmp_name);
    if (!$img_info)
    {
       $WarningStr = "Ошибка чтения временного файла!!!";
       return FALSE;
    }
    if ( ($img_info[2] != 1) && ($img_info[2]!= 2) )
    {
       $WarningStr = "Неправильный тип файла!!!";
       return FALSE;
    }
    if ( ($img_info[0]>$img_max_x) || ($img_info[1]>$img_max_y) )
    {
       $WarningStr = "Размер картинки не должен превышать $img_max_x$img_max_y пикселей!!!";
       return FALSE;
    }


следует убрать из функции CheckUplоаdImg(), перенести в функцию HandleUplоаdImg () и заменить строчку
    $img_info = GetImageSize($tmp_name);
на строчку:
    $img_info = GetImageSize($ImgDir."/".$HTTP_POST_FILES["File"]["name"]);
--------------------------------------------------------
Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)
Профиль 

Как переписать файл на сервер?№ 6
Автор: VoScorp
Дата : 30-07-04, Птн, 06:30:09

Спасибо тебе Большой Грызь!!
У меня всё пашет
Все ништяк
Единственное замечание: везде где используется слово Upload
ты в нём буквы "o" и "a" руской раскладкой написал, при копировании отсюда не работает
пока эти буквы по английски не напишиш!!
Профиль 

Как переписать файл на сервер?№ 7
Автор: Большой Грызь
Дата : 30-07-04, Птн, 07:15:57

Это мой конвертер постарался преобразовал все подстроки, которые являют собой MySQL команды (в данном случае - load). Лишняя защита от взлома форума.
Жизнь человека немного стоит по сравнению с его делом.
Но чтобы делать дело, надо жить.
(Э. Хемингуэй)

[ 30-07-04, Fri, 14:19:52 Отредактировано: Большой Грызь ]
Профиль 


Вы не зарегистрированы либо не вошли в портал!!!
Регистрация или вход в портал - в главном меню.



 Просмотров:   003185    Постингов:   000007