Сегодня сервис по загрузке файла на сервер (хостинг) встречается на всех сайтах социальных сетей, досках объявлений, сайтах знакомств и др. Суть его заключается в том, чтобы дать возможность посетителю веб ресурса опубликовать свои файлы (фото, документы) на просторах интернета.
При предоставлении данного сервиса есть один существенный минус. Дело в том, что разрешая загружать файл на свой сервер, мы как бы устанавливаем дверь, за которой необходим постоянный контроль. Так как в файле посетителя может быть не только полезная информация, но и вирусный код, который впоследствии может дать возможность злоумышленникам завладеть вашим сервером. Учитывая данный минус, необходимо тщательно проверять файлы до загрузки на сервер.
Но не буду вас запугивать, а лучше представлю вашему вниманию уже готовую функцию (PHP скрипт) для проверки и загрузки файлов на сервер. Функция 100% рабочая. Я сам использую её на своих сайтах. Данная функция написана под загрузку файлов изображений (фоток) в формате.jpg, .gif, .png. Но при желании можно внести изменения, чтобы адаптировать PHP скрипт под свои нужды.
В php скрипте реализованы две проверки:
Надеюсь в коде функции достаточно пояснений, чтобы разобраться с загрузкой файла на сервер. Но если возникнут вопросы, с удовольствием отвечу в комментариях.
Помещаем PHP код функции в отдельный файл: function.php и размещаем его на сервере в корневом каталоге.
И создадим html-файл в котором разместим форму для загрузки фото: index.html
upload.php - файл обработчик формы
name="button" - имя кнопки, при нажатии на которую запускается функция загрузки файла на сервер
Теперь разберем случай, когда необходимо загрузить на сервер сразу несколько файлов.
Для этого нам понадобиться в файлах function.php upload.php и index.html сделать некоторые изменения.
Пожалуй, это все, что вам необходимо для реализации сервиса по загрузке пользовательского файла на сервер (хостинг).
Еще одна функция, которая тесно связана с загрузкой графических файлов (фоток) - это функция для изменения размеров фотки:
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
;
}
?>
Наверняка, Вы часто загружали различные файлы на сайты . Например, загружали аватары на форуме , фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP . Именно через PHP в большинстве случаев это и реализуют.
Первым делом, что нужно усвоить - это то, что сама HTML-форма , в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:
Ключевой момент здесь - это атрибут "enctype " со значением "multipart/form-data ". Без него ничего работать не будет.
", в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:
print_r($_FILES);
?>
В результате, Вы увидите содержимое глобального двумерного массива $_FILES :
И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES ).
Теперь давайте уже закончим с загрузкой файлов на сервер в PHP , и для этого напишем такой код (""):
$uploadfile = "images/".$_FILES["somename"]["name"];
move_uploaded_file($_FILES["somename"]["tmp_name"], $uploadfile);
?>
То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию "images " с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.
Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.
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 » , подготовленной дружной командой проекта
Как загрузить файл на сервер используя PHP? В этой статье мы подробно рассмотрим этот вопрос с примерами.
Первое, что нужно знать для загрузка файлов на сервер - это особенности HTML-форм, которые отправляют файл.
Вот пример HTML-кода такой формы: