Для того чтобы сделать систему загрузки картинки или любого другого файла на сервер используется HTML-форма и PHP-скрипт обработки данных, отправленных этой формой. Именно таким способом реализованы разнообразные сервисы поддерживающие загрузку файлов на сервер. Реализуется она подобно обычной форме отправки данных на сервер .
Самая простая форма загрузки файла:
В результате получим форму, содержащую поле для выбора файла и кнопку, отправляющую данные формы на сервер:
Параметр entype получает в этой форме значение multipart/form-data, что определяет, что в данной форме будет выполнена отправка бинарных данных, т.е. файла. Если это значение не указать, то по умолчанию форма будет выполняться как отправка текстовой информации.
Параметр MAX_FILE_SIZE , указанный в форме определяет максимальный размер файла, заданный в байтах. По умолчанию, этот размер определяется настройками сервера.
Для указания загружаемого файла тег должен содержать тип "file", а так же для дальнейшей работы PHP-скрипта следует указать значение "name".
Отправка данных формы выполняется тегом с типом "submit". Он отображается обычной кнопкой.
Задача этого обработчика, получив данные формы, проверить ее на возможные ошибки, переместить полученный сервером временный файл в нужное место с заданным именем. Здесь же могут выполнять еще различные необходимые операции – запись информации в БД, создание уменьшенных копий изображений, сохранение изображений с добавлением авторских прав и многое другое.
В принимающем коде, данные о файле содержатся суперглобальном массиве $_FILES. Соответственно, просмотреть сведения об отправленном из формы файле, можно в $_FILES["my_file"]. Такой массив содержит следующую информацию:
После получения этой информации на сервере, файл должен быть скопирован в постоянную директорию, т.к. временный файл по завершении скрипта автоматически будет удален.
Копирование выполняется функцией copy() , параметрами которой служит имя исходного файла (для этого случая имя временного файла - $_FILES["my_file"]["tmp_name"]) и имя конечного файла.
В итоге должен получиться следующий код:
// указание директории и имени нового файла на сервере
$new_file = "/upload_files/"
.$_FILES["uploadfile"
]["name"
];
// копирование файла
if
(copy($_FILES["uploadfile"
]["tmp_name"
], $new_file)) {
echo
"Файл загружен на сервер"
;
} else
{
echo
"Ошибка при загрузке файла"
;
?>
Копирование файла, должно выполняться в существующую папку на сервере с имеющимися правами на создание в ней файлов.
В этом примере имя файла указывается тем же, как и у исходного загружаемого файла. В реале же очень часто имя задается в соответствии с собственными требованиями, чаще всего используя дату и время загрузки, что обеспечивает уникальность названия файла. Это позволяет свести хранение и обработку файлов к какому-либо единому стандарту. Здесь, конечно, появляются некоторые дополнительные задачи по хранению исходного названия в БД, если это нужно или определение расширения загружаемого файла . Но в таком случае будет меньше проблем с кодировкой названия фала, а так же цифровое название фала можно использовать для удобного формирования поддиректорий для хранения загружаемых фалов.
Функция copy() возвращает значение true, если копирование выполнено успешно и False при возникновении ошибки в процессе копирования.
При удачном завершении копирования, с загруженным на сервер файлом можно выполнять любые необходимые действия.
На PHP часто нужна загрузка файлов на сервер...приятно же, если у вашего сайта есть возможность загружать файлы на сайт: картинки или другие текстовые файлы или другие форматы...поговорим в этой статье об этом...
Итак нам нужно научиться загружать файл на сервер с помощью PHP. Для этого нам нужно знать, что такие загрузки происходят с помощью простой multipart-формы , у которой имеется специальное поле для загрузки файла.
В качестве параметра enctype в такой форме нужно указывать значение multipart/form-data. Отправляется методом POST.
После нажатия кнопки "Загрузать" PHP помещает файл во временную директорию и задает файлу временное имя(оно отличается от загружаемого - ниже будет видно). И сразу же создается 4 переменных глобального массива $_FILES:
Обратите внимание : после окончания работы скрипта загрузки файла на сервер - временный файл будет удален, поэтому необходимо скопировать этот файл из временной директории в какую-либо папку, например files при помощи функции copy() ; Не нужно применять функцию move(), так как у copy в этот момент есть 2 преимущества: временный файл самостоятельно удалиться, и если временный каталог находится на другом носителе - то выведется ошибка.
Подсказка : процесс должен начинаться по условию нажатия кнопки "Загрузить", то ест к примеру: if($_POST["submit"]){то выполняй действия}
Картинка, которая наглядно покажет 4 созданные переменные глобального массива $_FILES:
Я думаю теперь все у вас прояснилось, что куда попадает и что-где создается...и далее манипулирую этими полями, можем начать работать с этой формочкой на php
Примерно так может выглядеть сам скрипт:
if($_POST["submit"]){
@mkdir("files", 0777); // создаем папку, если ее нет то ошибки не будет, задаем права
/*echo "
";";*/
print_r($_FILES);
echo "
If(copy($_FILES["uploadfile"]["tmp_name"], $uploadfile)){
echo "
//Данные о загруженном файле
echo "
Оригинальное имя загруженного файла: ".$_FILES["uploadfile"]["name"]."
";Mime-тип загруженного файла: ".$_FILES["uploadfile"]["type"]."
";Размер загруженного файла в байтах: ".$_FILES["uploadfile"]["size"]."
";Временное имя файла: ".$_FILES["uploadfile"]["tmp_name"]."
";Вот так вот и происходит процесс загрузки файла на сервер средствами PHP.
Надеюсь было кому-либо полезно!
19KСегодня я хочу рассказать вам о разнообразных ситуациях, связанных с загрузкой файлов на сервер с помощью PHP-скриптов . Постараюсь привести примеры, как самой простой загрузки файла, так и мультизагрузки с применением move uploaded file PHP .
Для загрузки файлов на сервер. Прежде всего, нужно создать HTML-форму с полем file input . Затем привязать к ней PHP-скрипт , который переместит файл в указанную директорию. Чтобы закачать файл на сервер с помощью PHP-скрипта , выполните следующие действия:
Приведенный выше код необходим для создания формы. Как только пользователь выбирает файл и нажимает кнопку Upload , форма передаст данные с помощью метода POST на этой же странице, так как в качестве обработчика указан файл basic.php :
Важно: не забудьте добавить enctype=”multipart/form-data” в тег .
Приведенный выше код проверяет, загрузил ли пользователь файл. Если файл загружен, то мы перемещаем файл в указанную директорию. В приведенном выше скрипте мы перемещаем файл в ту же папку, где находится файл basic.php .
Ниже приведена полная версия PHP move uploaded file примера :
Пожалуйста, не тестируйте этот PHP move uploaded file пример на сервере. Он не отвечает требованиям безопасности, и был создан специально для того, чтобы наглядно показать, как загружать файлы с помощью PHP .
Вопрос:
Почему приведенный выше скрипт небезопасен?
Ответ:
С помощью скрипта, приведенного выше, можно загрузить файл любого типа на сервер. То есть, если вы используете скрипт в таком виде на “живом
” сервере, то любой хакер сможет загрузить собственные PHP-скрипты
, и взломать ваш сайт и сервер.
Чуть позже мы подробнее поговорим о защите скрипта для загрузки файлов на сервер.
$_FILES – это глобальная переменная в PHP наподобие $_POST или $_GET . Она представляет собой ассоциативный массив, в котором находится информация о загруженном файле с помощью метода HTTP POST .
То есть, если выполнить print_r($_FILES) для приведенного выше скрипта, то мы получим следующую информацию:
Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
То есть, для каждого поля в массиве создается элемент. Если вы создадите , то название элемента также будет изменено на test . Например:
Array ( => Array ( => upload-file-php.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpcQiYhh => 0 => 6887))
Теперь для каждого input file , перемещаемого с помощью move uploaded file PHP , создается пять элементов (name , type , tmp_name , error , size ). Давайте познакомимся с этими элементами поближе:
move_uploaded_file представляет собой функцию, которая перемещает загруженный файл из временной директории в папку назначения. Перед перемещением move_uploaded_file PHP проверяет, был ли загружен файл, указанный в HTTP-методе post .
Если файл был успешно перемещен, то вы получите ответ true или false . В первом примере мы использовали следующую строку кода:
move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)
А теперь давайте сделаем красиво, и выведем информацию:
if(move_uploaded_file($_FILES["inputfile"]["tmp_name"], $destiation_dir)){ echo "File Uploaded" } else{ echo "File Not uploaded" }
У каждой формы для загрузки файлов должен быть установлен лимит размера, иначе пользователи станут загружать увесистые файлы. Выставить ограничение на move uploaded file PHP можно двумя способами:
Если нужно сильно увеличить filesize , то не забудьте изменить время исполнения php-скриптов .
Теперь вы умеете ограничивать размер загружаемых файлов и знаете, как определить типы файлов, которые загружают пользователи. Пришло время позаботиться о безопасности нашего PHP move uploaded file примера.
В качестве примера сделаем так, чтобы пользователи не могли загружать jpeg-файлы размером свыше 1 Мб. Установите соответствующее ограничение в переменной upload_max_filesize файла php.ini . Ниже приведена улучшенная версия скрипта:
Можно загружать сразу несколько файлов при помощи $_FILES и move_uploaded_file PHP . Ниже я расскажу вам о двух способах мультизагрузки файлов с помощью PHP-скрипта :
1. Используя разные имена Input:
Можно загружать сразу несколько файлов, используя несколько элементов ввода. Как уже говорилось ранее, если мы создаем несколько элементов input, то в $_FILES будет создано несколько основных элементов. Например, для приведенной ниже формы:
$_FILES представит массив следующего содержания:
Array ( => Array ( => 20141002_094257.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpoBWrBZ => 0 => 2669096) => Array ( => 20141002_094247.jpg => image/jpeg => /Applications/XAMPP/xamppfiles/temp/phpjwUmVZ => 0 => 2207657))
Приведенный ниже PHP move uploaded file пример нужно писать с учетом того, что один элемент предназначен для аватарки (изображение ), а другой – для загрузки резюме (файла в формате .doc ):
2. Используем одно поле input, но с применением массива:
Как и в случае с другими типами input , для move uploaded file PHP мы можем использовать массив с input type , указанным в php . То есть:
То есть, для приведенного выше HTML , $_FILES предоставит данные со следующей структурой:
Array ( => Array ( => Array ( => upload-file-php.jpg => variable-scope-php.jpg => magic-constants.jpg) => Array ( => image/jpeg => image/jpeg => image/jpeg) => Array ( => /Applications/XAMPP/xamppfiles/temp/phpML5kOy => /Applications/XAMPP/xamppfiles/temp/phpNZbuw7 => /Applications/XAMPP/xamppfiles/temp/phpO8VFAk) => Array ( => 0 => 0 => 0) => Array ( => 6887 => 8036 => 9967)))
Скачать код, использованный в статье
Данная публикация представляет собой перевод статьи «File Upload With PHP Script » , подготовленной дружной командой проекта
Multiple files can be uploaded using different name for input .
It is also possible to upload multiple files simultaneously and have the information organized automatically in arrays for you. To do so, you need to use the same array submission syntax in the HTML form as you do with multiple selects and checkboxes:
Warning
As of PHP 5.2.12, the max_file_uploads configuration setting acts as a limit on the number of files that can be uploaded in one request. You will need to ensure that your form does not try to upload more files in one request than this limit.
14 years ago
When uploading multiple files, the $_FILES variable is created in the form:
Array
=> Array
=> foo.txt
=> bar.txt
)
=> Array
=> text/plain
=> text/plain
)
=> Array
=> /tmp/phpYzdqkD
=> /tmp/phpeEwEWG
)
=> Array
=> 0
=> 0
)
=> Array
=> 123
=> 456
)
I found it made for a little cleaner code if I had the uploaded files array in the form
Array
=> Array
=> foo.txt
=> text/plain
=> /tmp/phpYzdqkD
=> 0
=> 123
)
=> Array
=> bar.txt
=> text/plain
=> /tmp/phpeEwEWG
=> 0
=> 456
)
I wrote a quick function that would convert the $_FILES array to the cleaner (IMHO) array.
Function reArrayFiles (& $file_post ) {
$file_ary
= array();
$file_count
=
count
($file_post
[
"name"
]);
$file_keys
=
array_keys
($file_post
);
For ($i
=
0
;
$i
<
$file_count
;
$i
++) {
foreach ($file_keys
as
$key
) {
$file_ary
[
$i
][
$key
] =
$file_post
[
$key
][
$i
];
}
}
Return
$file_ary
;
}
?>
Now I can do the following:
If ($_FILES
[
"upload"
]) {
$file_ary
=
reArrayFiles
($_FILES
[
"ufile"
]);
Foreach ($file_ary
as
$file
) {
print
"File Name: "
.
$file
[
"name"
];
print
"File Type: "
.
$file
[
"type"
];
print
"File Size: "
.
$file
[
"size"
];
}
}
?>
5 years ago
This is also needed for elements.
So, if you have an input element like this:
This should be written as
else you"ll only be able to get one of the files.
9 years ago
Here is a function to fix the indices of a multi-dimensional for easier parsing when dealing with file uploads. It takes a single $_FILES field array as a parameter and separates each individual uploaded file by numeric key. This allows for iterating like:
fixFilesArray
($_FILES
[
"array_of_files"
]);
foreach ($_FILES
[
"array_of_files"
] as
$position
=>
$file
) {
// should output array with indices name, type, tmp_name, error, size
var_dump
($file
);
}
?>
Here"s the code:
/**
* Fixes the odd indexing of multiple file uploads from the format:
*
* $_FILES["field"]["key"]["index"]
*
* To the more standard and appropriate:
*
* $_FILES["field"]["index"]["key"]
*
* @param array $files
* @author Corey Ballou
* @link http://www.jqueryin.com
*/
function
fixFilesArray
(&
$files
)
{
$names
= array("name"
=>
1
,
"type"
=>
1
,
"tmp_name"
=>
1
,
"error"
=>
1
,
"size"
=>
1
);
Foreach ($files
as
$key
=>
$part
) {
// only deal with valid keys and multiple files
$key
= (string)
$key
;
if (isset($names
[
$key
]) &&
is_array
($part
)) {
foreach ($part
as
$position
=>
$value
) {
$files
[
$position
][
$key
] =
$value
;
}
// remove old key reference
unset($files
[
$key
]);
}
}
}
?>
3 years ago
This is a very simple example:
echo "
" ;
$img = $_FILES [ "img" ];if(!empty($img ))
{
$img_desc = reArrayFiles ($img );
print_r ($img_desc );Foreach($img_desc as $val )
{
$newname = date ("YmdHis" , time ()). mt_rand (). ".jpg" ;
move_uploaded_file ($val [ "tmp_name" ], "./uploads/" . $newname );
}
}function reArrayFiles ($file )
{
$file_ary = array();
$file_count = count ($file [ "name" ]);
$file_key = array_keys ($file );For($i = 0 ; $i < $file_count ; $i ++)
{
foreach($file_key as $val )
{
$file_ary [ $i ][ $val ] = $file [ $val ][ $i ];
}
}
return $file_ary ;
}2 years ago
Once I had to do a maintenance in a huge ERP that had several multiple upload inputs inside an array. Just like this:
The $_FILES array is created like this:
Array
=> Array
=> Array
=> teste.c
=> teste
)
=> Array
=> text/x-csrc
=> application/octet-stream
)
=> Array
=> /opt/lampp/temp/phpuf3KNj
=> /opt/lampp/temp/php0yPZap
)
=> Array
=> 0
=> 0
)
=> Array
=> 1960
=> 8661
)
=> Array
=> Array
=> jefrey.html
=> notas.txt
)
=> Array
=> text/html
=> text/plain
)
=> Array
=> /opt/lampp/temp/php87nfyu
=> /opt/lampp/temp/phpUBlvVz
)
=> Array
=> 0
=> 0
)
=> Array
=> 583
=> 191
)
I"ve managed to re-arrange this array like this:
Array
=> Array
=> Array
=> teste.c
=> text/x-csrc
=> /opt/lampp/temp/phpuf3KNj
=> 0
=> 1960
)
=> Array
=> teste
=> application/octet-stream
=> /opt/lampp/temp/php0yPZap
=> 0
=> 8661
)
=> Array
=> Array
=> jefrey.html
=> text/html
=> /opt/lampp/temp/php87nfyu
=> 0
=> 583
)
=> Array
=> notas.txt
=> text/plain
=> /opt/lampp/temp/phpUBlvVz
=> 0
=> 191
)
Here"s my snippet:
function
reArrayFilesMultiple
(&
$files
) {
$uploads
= array();
foreach($_FILES
as
$key0
=>
$FILES
) {
foreach($FILES
as
$key
=>
$value
) {
foreach($value
as
$key2
=>
$value2
) {
$uploads
[
$key0
][
$key2
][
$key
] =
$value2
;
}
}
}
$files
=
$uploads
;
return
$uploads
;
// prevent misuse issue
}
?>
3 years ago
This is just a modification of the code which is the top note by "phpuser" here. His/her version requires that the $file_post array passed in to the function was created by a form submitted with the multiple attribute set. With multiple set in the html input tag, $_FILES["fileInputName"]["name"] is an array no matter if only one file is sent or multiple. But when is used without the multiple attribute then $_FILES["fileInputName"]["name"] is not an array, it contains the the string with the filename. To use this neat function with or without multiple set and to get back an array which you can "foreach" over in either case, use this modification:
function reArrayFiles(&$file_post)
{
$file_ary = array();
$multiple = is_array($file_post["name"]);
$file_count = $multiple ? count($file_post["name"]) : 1;
$file_keys = array_keys($file_post);
For ($i=0; $i<$file_count; $i++)
{
foreach ($file_keys as $key)
{
$file_ary[$i][$key] = $multiple ? $file_post[$key][$i] : $file_post[$key];
}
}
Return $file_ary;
}
3 years ago
Recursive solution for complex situations (supports any nested arrays including indexed arrays)
function getFixedFilesArray() {
$walker = function ($arr, $fileInfokey, callable $walker) {
$ret = array();
foreach ($arr as $k => $v) {
if (is_array($v)) {
$ret[$k] = $walker($v, $fileInfokey, $walker);
} else {
$ret[$k][$fileInfokey] = $v;
}
}
return $ret;
};
$files = array();
foreach ($_FILES as $name => $values) {
// init for array_merge
if (!isset($files[$name])) {
$files[$name] = array();
}
if (!is_array($values["error"])) {
// normal syntax
$files[$name] = $values;
} else {
// html array feature
foreach ($values as $fileInfoKey => $subArray) {
$files[$name] = array_replace_recursive($files[$name], $walker($subArray, $fileInfoKey, $walker));
}
}
}
Return $files;
}
10 years ago
If you try and upload files with multi-dimensional names like this:
You will get an unexpected format like this:
array(
"submission"
=> array
"name"
=> array("screenshot"
=>
"monster_wallpaper.jpg"
),
"type"
=> array("screenshot"
=>
"image/jpeg"
),
"tmp_name"
=> array("screenshot"
=>
"/tmp/php48lX2Y"
),
"error"
=> array("screenshot"
=>
0
),
"size"
=> array("screenshot"
=>
223262
),
),
....
?>
You can use the following function to re-format the array recursively in the usual format:
function
format_files_array
($files
,
$name
=
null
, &
$new
=
false
,
$path
=
false
){
$names
= array("name"
=>
"name"
,
"type"
=>
"type"
,
"tmp_name"
=>
"tmp_name"
,
"error"
=>
"error"
,
"size"
=>
"size"
);
Foreach($files
as
$key
=> &
$part
)
{
$key
= (string)
$key
;
if(in_array
($key
,
$names
))
$name
=
$key
;
if(!
in_array
($key
,
$names
))
$path
=
$key
;
if(is_array
($part
))
$part
=
format_files_array
($part
,
$name
,
$new
,
$path
);
elseif(!
is_array
($part
))
{
$current
=&
$new
;
foreach($path
as
$p
)
$current
=&
$current
[
$p
];
$current
[
$name
] =
$part
;
unset($path
);
$name
=
null
;
}
}
Return
$new
;
}
?>
У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!
Что такое Upload files, или почему не работает
copy ("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg ")
Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения - сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:
При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение - проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.
Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку "Send file"? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.
Как должен выглядеть upload.php?
$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["name"])) { print "File is valid, and was successfully uploaded."; } else { print "There some errors!"; }
При написании скрипта, возникает естественный вопрос: как получить информацию о загруженном файле и достучаться до самого файла. Если Вы используете PHP версии 4.1.0 и старше, лучше всего будет обратиться к глобальному массиву $_FILES. Для каждого загруженного файла он содержит хеш-массив, со следующими данными:
Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;
Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах - использовать массив $_FILES.
Для работы с загруженными файлами лучше всего использовать встроенные функции is_uploaded_file() и move_uploaded_file() , которые проверяют, был ли загружен файл, и помещают его в указанную папку соответственно. Более детальную информацию Вы можете найти на страницах руководства. Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.
Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?
Если Вы "все сделали правильно", но Ваш код неработает, или работает неправильно, не спешите отчаиваться. Возможно проблема не в Ваших руках, а в неверных настройках сервера. Вот список директив, которые имеют отношения к загрузке файлов:
В файле php.ini:
В файле httpd.conf :
Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.
Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.
Но при этом могут возникнуть осложнения: будьте готовы к тому, что в некоторых случаях текстовые части запросов вам придется перекодировать самостоятельно. Вот что по этому поводу говорится в документации:
Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.
Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps
Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.
Не забывайте, что после любой смены конфигурации, Вам необходимо перезапустить Ваш веб-сервер.
Также возможна настройка параметров Apach с помощью.htaccess:
Php_value upload_max_filesize 50M php_value post_max_size 50M
Пример формы загрузки нескольких файлов:
И не забудьте увеличить post_max_size , если предполагается много файлов
Не стоит забывать, что файлы на диске пользователя - конфиденциальная информация, к которой ни JavaScript, ни уж тем более PHP не имеют ни малейшего отношения. До тех пор, пока пользователь сам не выбрал файл при помощи ни о какой работе с ним не может идти и речи. И не забывайте, что у данного поля ввода атрибут value защищен от записи.
Если Вы собрались хранить загружаемы файлы в базе данных, Вам необходимо помнить следующие моменты:
Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.
Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.
Если перед вами возникла задача проверить тип или размеры картинки перед загрузкой файла на сервер, вам потребуется функция getimagesize() . В качестве аргумента она принимает имя файла на диске и возвращает массив, первые два элемента которого - ширина и высота соответственно, третий - тип изображения. В случае невозможности прочитать из указанного файла корректное изображение, функция возвращает ложь.
При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия "нестандартных" символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES["userfile"]["name"]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP .
Необходимо учитывать, что до полной загрузки файла, PHP не может оперировать ни размером файла, ни процентом его загрузки. Только когда файл уже находится на сервере PHP, то он получает возможность обращаться к информации. Если вам все-таки крайне необходимо реализовать такую возможность, воспользуйтесь Java-аплетом.
Проблемы с правами на сервере (upload_tmp_dir)
В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.
Доступность файла или каталога зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой:
Владелец Группа Прочие (u) (g) (o) rwx rwx rwx
Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. Права - любая осмысленная комбинация следующих букв:
r Право на чтение. (4)
w Право на запись. (2)
x Право на выполнение (поиск в каталоге). (1)
Оригинал статьи находится на сайте PHP Club