Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Загрузка файлов на сервер
На страницу 1, 2, 3, 4  След.
 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP
 
Автор Сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Ср Dec 13, 2006 11:28 am    Заголовок сообщения: Загрузка файлов на сервер
Ответить с цитатой

Здесь будет рассмотрена загрузка файлов на сервер по протоколу HTTP. Рассмотрим два варианта конфигурации PHP:
register_globals=On - все параметры передаваемые скрипту, автоматически становятся глобальными переменными.
register_globals=Off - параметры передаваемые скрипту заносятся в массивы $_GET, $_POST, $_FILES, $_COOKIE, ...

Upload файлов при register_globals=On

Напишем HTML форму для отправки файла на сервер.

Содержание формы (файл upload.html):
<html>
<body>
<FORM ENCTYPE="multipart/form-data" ACTION="myup.php" METHOD=POST>
Выберете файл: <INPUT NAME="myfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Загрузить">
</FORM>
</body>
</html>

После того как пользователь выбрал имя файла и нажал кнопку Загрузить, PHP помещает загружаемый файл во временную директорию указанную в параметре upload_tmp_dir файла php.ini. В этой директории этот файл будет храниться только во время запроса! После запроса PHP удалит этот временный файл. Поэтому загружаемый файл нужно куда-нибудь переместить (если он вам понадобиться в дальнейшем). Явно удалить временный файл можно функцией unlink(string filename).

Здесь рассмотрим загрузку текстового файла и вывод его содержимого.

Скрипт обработки:

<?php
// Загрузка файлов на сервер
// Если register_globals=On

print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
print("MIME-тип файла: ".$myfile_type."<br>");
print("Размер файла: ".$myfile_size."<br><br>");

// Получаем содержимое файла
$fp = fopen($myfile,"r");
$content = fread($fp, filesize($myfile));
fclose($fp);

// Вывод содержимого файла
print($content);
?>

Пояснения:

$myfile - имя временного файла, в котором находятся загруженные данные;

Когда пользователь отправляет форму, PHP автоматически определяет ещё несколько переменных:

$myfile_name - имя файла на компьютере компьютере пользователя;

$myfile_type - MIME-тип файла.

$myfile_size - размер файла в байтах.

При загрузке текстовых файлов переменная $myfile_type = "text/plain", при загрузке изображения gif переменная $myfile_type = "image/gif".

При register_globals=On можно пользоваться массивом $_FILES[].


Upload файлов при register_globals=Off

В этом случае PHP формирует массив $_FILES[]. В этом массиве храниться вся информация о всех загружаемых файлах. В нашем случае структура этого массива следующая:

$_FILES["myfile"]["tmp_name"] - Имя временного файла
$_FILES["myfile"]["name"] - Имя файла на компьютере пользователя
$_FILES["myfile"]["size"] - Размер файла в байтах
$_FILES["myfile"]["type"] - MIME-тип файла
$_FILES["myfile"]["error"] - код ошибки.

PHP код для обработки формы:

<?php
// Загрузка файлов на сервер
// Если register_globals=Off

// Если upload файла
if(isset($_FILES["myfile"]))
{
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$myfile_size = $_FILES["myfile"]["size"];
$myfile_type = $_FILES["myfile"]["type"];
$error_flag = $_FILES["myfile"]["error"];

// Если ошибок не было
if($error_flag == 0)
{
print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");
print("MIME-тип файла: ".$myfile_type."<br>");
print("Размер файла: ".$myfile_size."<br><br>");

// Получаем содержимое файла
$fp = fopen($myfile,"r");
$content = fread($fp, filesize($myfile));
fclose($fp);

// Вывод содержимого файла
print($content);

} // end of if 2
} // end of if 1
?>

При загрузке можно проверять размер файла ($myfile_size) и если его размер превышает требуемый, то вывод файла не производить.

Значения $_FILES["myfile"]["error"]:

0 - ошибок не было, файл загружен.
1 - размер загруженного файла превышает размер установленный параметром upload_max_filesize в php.ini
2 - размер загруженного файла превышает размер установленный параметром MAX_FILE_SIZE в HTML форме.
3 - загружена только часть файла
4 - файл не был загружен (Пользователь в форме указал неверный путь к файлу).

Если вам необходимо сохранить загруженный файл, то это можно сделать с помощью функций:
copy ( string source, string dest);
move_uploaded_file ( string filename, string destination);

Функция copy() копирует файл source в место назначения dest.

Функция move_uploaded_file() перемещает загруженный файл filename в место назначение указанное в параметре destination.

Ещё хочется отметить что при одновременной загрузке нескольких файлов т.е. когда HTML форма содержит:

<INPUT NAME="myfile1" TYPE="file">
<INPUT NAME="myfile2" TYPE="file">
<INPUT NAME="myfile3" TYPE="file">

массив $_FILES[] будет иметь следующую структуру:

$_FILES["myfile1"]["tmp_name"] - Имя временного файла 1
$_FILES["myfile1"]["name"] - Имя файла на компьютере пользователя 1
$_FILES["myfile1"]["size"] - Размер файла 1 в байтах
$_FILES["myfile1"]["type"] - MIME-тип файла 1
$_FILES["myfile1"]["error"] - код ошибки для файла 1.

$_FILES["myfile2"]["tmp_name"] - Имя временного файла 2
$_FILES["myfile2"]["name"] - Имя файла на компьютере пользователя 2
$_FILES["myfile2"]["size"] - Размер файла 2 в байтах
$_FILES["myfile2"]["type"] - MIME-тип файла 2
$_FILES["myfile2"]["error"] - код ошибки для файла 2.

$_FILES["myfile3"]["tmp_name"] - Имя временного файла 3
$_FILES["myfile3"]["name"] - Имя файла на компьютере пользователя 3
$_FILES["myfile3"]["size"] - Размер файла 3 в байтах
$_FILES["myfile3"]["type"] - MIME-тип файла 3
$_FILES["myfile3"]["error"] - код ошибки для файла 3.

это пример для одновременной загрузки трёх файлов.

Таким же образом можно загружать и двоичные файлы, например файлы картинок gif, jpeg и т.д.

У меня все двоичные файлы загружались без повреждений (без глюков), но по словам Дмитрия Бородина (http://php.spb.ru) возможно, что при загрузке двоичных файлов у вас возникнут проблемы. Файлы будут загружаться с перекодировкой.

Вот часть статьи "Как делать UPLOAD файлов на сервер и о возможных глюках" сайта http://php.spb.ru, которая возможно поможет вам устранить причину проблемы:

ЦИТИРОВАНИЕ

Попробуйте аплодить таким способом на сервер бинарные файлы. Скорее всего файлы окажутся "битыми": фотки не будут показываться, программы не запустятся, архивы не распакуются. Текстовые файлы (почти точно) не повредятся. Дело в том, что Русский Апач (ваш веб-сервер) перекодирует все подряд. Например, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20). Чтобы выключить эту ненужную перекодировку, допишите в файл httpd.conf из каталога Апача (/usr/local/apache) следующие строки. Если у вас нет доступа к этому файлу и админ сервера не может сделать это за вас, ткните его в эти строки.

<Location />
CharsetRecodeMultipartForms Off
</Location>

Строку CharsetRecodeMultipartForms Off можно добавлять в разные места (один раз). Если вы совсем начинающий пользователь и не решите сами, куда писать эту строку, будьте аккуратнее при решении задачи методом тыка.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Вт Фев 10, 2009 3:37 pm    Заголовок сообщения:
Ответить с цитатой

А можно немного подробнее о том, куда всё же надо вставлять эти строки (<Location />CharsetRecodeMultipartForms Off </Location>)? А то я вставляю, а у меня или вообще apache перестает работать или показывает огромную кучу непонятных значков (яШяа�JFIF����) вместо изображения.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вт Фев 10, 2009 4:01 pm    Заголовок сообщения:
Ответить с цитатой

Просто в конфиг apach'a - httpd.conf

У тебя какая версич Апача, и под винду или под Линукс он?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Чт Фев 12, 2009 8:08 pm    Заголовок сообщения:
Ответить с цитатой

Под винду, апаче второй. Я куда только не вставляла(по всему файлу прошлась), но все равно не работает.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Фев 13, 2009 5:00 am    Заголовок сообщения:
Ответить с цитатой

А если вообще не вставлять, загрузка файлов работает? Или файлы битые?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Пт Фев 13, 2009 9:47 am    Заголовок сообщения:
Ответить с цитатой

файлы битые, хоть как.
сделала по примеру, как здесь написано, всю информацию о файле выдает, а ниже эти "значки".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Сб Фев 14, 2009 6:57 pm    Заголовок сообщения:
Ответить с цитатой

Вы не знаете в чем может быть проблема и как ее решить??? Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Tuxik

Тяпницо


Зарегистрирован: 02.07.2007
Сообщения: 1521

СообщениеДобавлено: Сб Фев 14, 2009 7:39 pm    Заголовок сообщения:
Ответить с цитатой

Неа. Если б Den был автором PHP, то ваш вопрос был бы резонен....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Сб Фев 14, 2009 7:41 pm    Заголовок сообщения:
Ответить с цитатой

Приведи свой конфиг Апача.

Цитата:

а ниже эти "значки".

Какие?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Сб Фев 14, 2009 8:57 pm    Заголовок сообщения:
Ответить с цитатой

Вот такой результат отправки файла :

Код:

Имя файла на нашем сервере (во время запроса): C:\xampp
\tmp\php151.tmp
Имя файла на компьютере пользователя: image.gif
MIME-тип файла: image/gif
Размер файла: 99272

яШяа�JFIF������яю�;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 85 яЫ�C�  !"$"$яЫ�CяА�Ги"�яД����������� яД�µ���}�!1AQa"q2Ѓ‘Ў#B±БRСр$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ„…†‡?‰Љ’“”•–—�™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪбвгдежзийкстуфхцчшщъяД�������� яД�µ��w�!1AQaq"2ЃB‘Ў±Б #3RрbrС $4б%с&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ѓ„…†‡?‰Љ’“”•–—�™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪвгдежзийктуфхцчшщъяЪ� ��?�цQAТgЊТЮ’`G4УнЦ”±¤И<Р+ЌЙ№ИЖh ґ qHW RнИЖ)Г­-0#+LeзҐOЕ!Е)2іЗйP<�iRi›*ИZkh°\®Sћ”‚?AV¤АҐaЬ?D1KесТ¦P;QЕ ‘фҐЩЕIЃљ1NАBГВ*БнЕFЛ@Ђ:R•!�X.4J.9§mўБМ& 8 �§ЋФX\В)§ (-это в сокращенном виде)


Последний раз редактировалось: Лиза (Пн Фев 16, 2009 2:27 pm), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Вс Фев 15, 2009 1:29 am    Заголовок сообщения:
Ответить с цитатой

Чтобы не было тех символов удали следующую строчку:

print($content);

После загрузки файла на сервер его можно открыть в программе для просмотра?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Пн Фев 16, 2009 10:04 am    Заголовок сообщения:
Ответить с цитатой

Открыть можно. А если я удалю строчку print, то как же мне тогда вывести фото на сайт?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пн Фев 16, 2009 10:20 am    Заголовок сообщения:
Ответить с цитатой

Файл загрузится на сервер, $myfile - его имя.

Потом выводишь <IMG>:

echo "<img src=$myfile>";

Но желательно после загрузки файла скопировать (переместить) его в другой каталог, а потом уже выводить
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Лиза

Новенький


Зарегистрирован: 10.07.2008
Сообщения: 35

СообщениеДобавлено: Пн Фев 16, 2009 11:16 am    Заголовок сообщения:
Ответить с цитатой

Теперь открывает файлы, но только те, которые расположены в директории /xampp/htdocs/, т.е. которые уже как-бы на сервере, копирует их в другую папку и выводит. А файлы с других папок не копирует, показывает вот такую ошибку :
"Warning: copy(image.gif) [function.copy]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\ind15.php on line 38"
На 38 строке у меня вот это: copy($myfile_name, 'C:/Program Files/xampp/htdocs/temp/'.$myfile_name)
пробовала поменять на : copy($myfile, 'C:/Program Files/xampp/htdocs/temp/'.$myfile_name) , тогда копирует но не выводит изображение
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пн Фев 16, 2009 1:04 pm    Заголовок сообщения:
Ответить с цитатой

Читаем внимательно

"Warning: copy(image.gif) [function.copy]: failed to open stream: No such file or directory in C:\Program Files\xampp\htdocs\ind15.php on line 38"

Не могу открыть поток: нет такого файла или каталога

Ты неправильно указала имя файла при копировании.

print("Имя файла на нашем сервере (во время запроса): ".$myfile."<br>");
print("Имя файла на компьютере пользователя: ".$myfile_name."<br>");

$myfile - это имя файла на сервере, обычно phpXXXX
$myfile_name - это имя файла на компе пользователя, на сервере его нету, поэтому ты получаешь сообщение об ошибке

Не выводит, потому что неправильно путь указан

echo "<img src=http://localhost/temp/$myfile_name>";
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> PHP Часовой пояс: GMT
На страницу 1, 2, 3, 4  След.
Страница 1 из 4
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис