IT Новости из мира ПК
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

Php move file


(PHP 4 >= 4.0.3, PHP 5, PHP 7)

move_uploaded_file — Перемещает загруженный файл в новое место


Эта функция проверяет, является ли файл filename загруженным на сервер (переданным по протоколу HTTP POST). Если файл действительно загружен на сервер, он будет перемещён в место, указанное в аргументе destination .

Такая проверка особенно важна в том случае, если существует шанс того, что какие-либо действия, производимые над загруженным файлом, могут открыть его содержимое пользователю или даже другим пользователям системы.

Список параметров

Путь к загруженному файлу.

Путь, по которому необходимо переместить файл.

Возвращаемые значения

В случае успеха возвращает TRUE .

Если filename не является загруженным файлом, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE .

Если filename является загруженным файлом, но не может быть перемещён по каким-либо причинам, никаких действий не предпринимается и move_uploaded_file() возвращает FALSE . Кроме того, отображается предупреждение.


Пример #1 Загрузка нескольких файлов


Функция move_uploaded_file() принимает во внимание как безопасный режим, так и open_basedir. Тем не менее, ограничения накладываются лишь на параметр destination , чтобы разрешить перемещение загруженных файлов, так как параметр filename может конфликтовать с этими ограничениями. move_uploaded_file() гарантирует безопасность этой операции, работая лишь с теми файлами, которые были загружены через PHP.

Если результирующий файл уже существует, он будет перезаписан.

Смотрите также

  • is_uploaded_file() — Определяет, был ли файл загружен при помощи HTTP POST
  • rename() — Переименовывает файл или директорию
  • Простой пример использования этой функции можно найти в разделе «Загрузка файлов на сервер»

User Contributed Notes 40 notes

Security tips you must know before use this function :

First : make sure that the file is not empty.

Second : make sure the file name in English characters, numbers and (_-.) symbols, For more protection.

You can use below function as in example

* Check $_FILES[][name]
* @param (string) $filename — Uploaded file name.
* @author Yousef Ismaeil Cliprz
function check_file_uploaded_name ( $filename )
(bool) (( preg_match ( «`^[-0-9A-Z_.]+$`i» , $filename )) ? true : false );


Third : make sure that the file name not bigger than 250 characters.

* Check $_FILES[][name] length.
* @param (string) $filename — Uploaded file name.
* @author Yousef Ismaeil Cliprz.
function check_file_uploaded_length ( $filename )
return (bool) (( mb_strlen ( $filename , «UTF-8» ) > 225 ) ? true : false );


Fourth: Check File extensions and Mime Types that you want to allow in your project. You can use : pathinfo() http://php.net/pathinfo

or you can use regular expression for check File extensions as in example

or use in_array checking as

= array( ‘gif’ , ‘jpg’ , ‘jpe’ , ‘jpeg’ , ‘png’ );


You have multi choices to checking extensions and Mime types.

Fifth: Check file size and make sure the limit of php.ini to upload files is what you want, You can start from http://www.php.net/manual/en/ini.core.php#ini.file-uploads

And last but not least : Check the file content if have a bad codes or something like this function http://php.net/manual/en/function.file-get-contents.php.

You can use .htaccess to stop working some scripts as in example php file in your upload path.

AddHandler cgi-script .php .pl .jsp .asp .sh .cgi
Options -ExecCGI

Do not forget this steps for your project protection.

nouncad at mayetlite dot com posted a function that uploaded a file, and would rename it if it already existed, to filename[n].ext

It only worked for files with extensions exactly three letters long, so I fixed that (and made a few other improvements while I was at it).

// Usage: uploadfile($_FILE[‘file’][‘name’],’temp/’,$_FILE[‘file’][‘tmp_name’])
function uploadfile ( $origin , $dest , $tmp_name )
$origin = strtolower ( basename ( $origin ));
$fulldest = $dest . $origin ;
$filename = $origin ;
for ( $i = 1 ; file_exists ( $fulldest ); $i ++)
$fileext = ( strpos ( $origin , ‘.’ )=== false ? » : ‘.’ . substr ( strrchr ( $origin , «.» ), 1 ));
$filename = substr ( $origin , 0 , strlen ( $origin )- strlen ( $fileext )). ‘[‘ . $i . ‘]’ . $fileext ;
$fulldest = $dest . $newfilename ;

if ( move_uploaded_file ( $tmp_name , $fulldest ))
return $filename ;
return false ;

move_uploaded_file (on my setup) always makes files 0600 («rw- — —«) and owned by the user running the webserver (owner AND group).
Even though the directory has a sticky bit set to the group permissions!
I couldn’t find any settings to change this via php.ini or even using «umask()».

I want my regular user on the server to be able to «tar cjf» the directory .. which would fail on files totally owned by the webserver-process-user;
the «copy(from, to)» function obeys the sticky-bit though!

To nouncad at mayetlite dot com,

That function will work fine for files with a 3-character file extension. However, it is worth noting that there are valid, registered file extensions that are longer than 3 characters. For example, a JPEG file can be denoted by *.jpg (and others), but it can also have *.jpeg as a valid extension. Check out http://www.filext.com/ for a good reference of file extensions.

The best bet to me would be parsing the uploaded file’s name ($_FILES[‘uploadedfile’][‘name’]) based on the presence of dots. Another wrench in the gears: a file can have dots in the filename. That’s easy enough to handle — just explode() the file name and hope that the last element in the array it gives you is the file extension (you can always validate it if you’re so inclined). Then just piece it together in a string accordingly by stepping through the array (don’t forget to add those dots back to where they were!), appending a guaranteed unique string of characters (or enumerate it like you were doing, keeping track via a loop), and finally tacking on the file extension.

You may have other mechanisms for verifying a file’s extension, such as a preg_match on the whole name, using something like «/\.(gif|jpg|jpeg|png|bmp)$/i» (more can, of course, be added if you so desire) for the most common types of images found on the web.

For blindly guaranteeing an uploaded file will be uniquely named, this seems like a fantastic way to go. Enjoy!

Читать еще:  Php html encode

I have the same problem as the person two comments below me. When I use the move_uploaded_file function the permissions for the file are set to 0600. No matter what configurations you set.

I searched the internet and I found more people with the same problems, but no solutions. I set the umask of apache to 013 and still the files were set to 0600.

The copy function solves the problem. Another way to solve this problem is using the chmod function after uploading.

I have for a couple of years been stymed to understand how to effectively load images (of more than 2MB) and then create thumbnails. My note below on general file uploading was an early hint of some of the system default limitations and I have recently discovered the final limit I offer this as an example of the various missing pieces of information to successfully load images of more than 2MB and then create thumbnails. This particular example assumes a picture of a user is being uploaded and because of browser caching needs a unique number at the end to make the browser load a new picture for review at the time of upload. The overall calling program I am using is a Flex based application which calls this php file to upload user thumbnails.

The secret sauce is:

1. adjust server memory size, file upload size, and post size
2. convert image to standard formate (in this case jpg) and scale

The server may be adjusted with the .htaccess file or inline code. This example has an .htaccess file with file upload size and post size and then inline code for dynamic system memory.

htaccess file:
php_value post_max_size 16M
php_value upload_max_filesize 6M

// $img_base = base directory structure for thumbnail images
// $w_dst = maximum width of thumbnail
// $h_dst = maximum height of thumbnail
// $n_img = new thumbnail name
// $o_img = old thumbnail name
function convertPic ( $img_base , $w_dst , $h_dst , $n_img , $o_img )
< ini_set ( 'memory_limit' , '100M' ); // handle large images
unlink ( $img_base . $n_img ); // remove old images if present
unlink ( $img_base . $o_img );
$new_img = $img_base . $n_img ;

$file_src = $img_base . «img.jpg» ; // temporary safe image storage
unlink ( $file_src );
move_uploaded_file ( $_FILES [ ‘Filedata’ ][ ‘tmp_name’ ], $file_src );

list( $w_src , $h_src , $type ) = getimagesize ( $file_src ); // create new dimensions, keeping aspect ratio
$ratio = $w_src / $h_src ;
if ( $w_dst / $h_dst > $ratio ) < $w_dst = floor ( $h_dst * $ratio );>else < $h_dst = floor ( $w_dst / $ratio );>

switch ( $type )
$img_src = imagecreatefromgif ( $file_src );
case 2 : // jpeg -> jpg
$img_src = imagecreatefromjpeg ( $file_src );
case 3 : // png -> jpg
$img_src = imagecreatefrompng ( $file_src );
$img_dst = imagecreatetruecolor ( $w_dst , $h_dst ); // resample

imagecopyresampled ( $img_dst , $img_src , 0 , 0 , 0 , 0 , $w_dst , $h_dst , $w_src , $h_src );
imagejpeg ( $img_dst , $new_img ); // save new image

unlink ( $file_src ); // clean up image storage
imagedestroy ( $img_src );
imagedestroy ( $img_dst );

$p_id = (Integer) $_POST [ uid ];
$ver = (Integer) $_POST [ ver ];
$delver = (Integer) $_POST [ delver ];
convertPic ( «your/file/structure/» , 150 , 150 , «u» . $p_id . «v» . $ver . «.jpg» , «u» . $p_id . «v» . $delver . «.jpg» );

Загрузка файлов на сервер в PHP

Наверняка, Вы часто загружали различные файлы на сайты. Например, загружали аватары на форуме, фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP. Именно через PHP в большинстве случаев это и реализуют.

Первым делом, что нужно усвоить — это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:

Ключевой момент здесь — это атрибут «enctype» со значением «multipart/form-data«. Без него ничего работать не будет.

Теперь пишем скрипт «loading.php«, в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

В результате, Вы увидите содержимое глобального двумерного массива $_FILES:

  • name — имя загружаемого файла.
  • typeMIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
  • tmp_name — физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
  • error — код ошибки. Если , то ошибок нет.
  • size — размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).

И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).

Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код («loading.php«):

То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию «images» с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

Читать еще:  Php mysql linux

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 62 ):

    У меня этот скрипт не работает! Неделю голову ломал. PHP говорит, что одно значение лишнее. Убирал каждое по очереди: в двух синтаксическая ошибка, в другой — просто ничего.

    Вот посмотри тут может яснее будет http://saitsozdanie.ru/php/php-zagruzka-fajlov-na-server.html

    а что прописывается в пункте [somename] и [tmp_name]?? в [name] пишется имя файла, что на форме?

    somename — это название поля с файлом в HTML-форме, а в tmp_name прописывается временный путь к файлу на сервере. Он генерируется самим PHP.

    тоесть [tmp_name] оставляем пустым или так и писать [tmp_name]? (Выберите фоновый рисунок: ) Здесь [somename]=path? а что пишется тогда в после [name]?

    — вот так, tmp_name нужен для того, чтобы потом можно было скопировать файл из этого временного пути в уже какую-то папку на сайте.

    ————— «; PRINT «Вас приветствует «.$_POST[‘firstname’]; PRINT «

    «; PRINT «Название статьи — «.$_POST[‘articlename’]; Print «

    «; $uploadfile = «images/».$_FILES[‘somename’][‘name’]; move_uploaded_file($_FILES[‘somename’][‘tmp_name’], $uploadfile); ?> вроде бы сделал все правильно, но ничего вообще не выводит.

    Учитесь искать ошибки самостоятельно: http://myrusakov.ru/php-finderror.html Это действительно очень важно! И на будущее. Ваши ошибки происходят от того, что Вы изначально неправильно работаете. Вот правильный подход к программированию: http://myrusakov.ru/how-programming.html

    Михаил, помогите с загрузкой нескольких файлов на сервер.

    Создайте несколько полей типа file, и берите все файлы из массива $_FILES.

    а как-то более красивше. ну скажем, нельзя же предусмотреть, сколько изображений клиент захочет загрузить. как работать с multiple?

    И так красиво. А поля можно добавлять по мере их заполнения через JavaScript.

    У Вас есть статья, как добавлять эти поля после заполнения верхних через яву?

    Через onclick можно и проверку value, если оно не пустое, то добавить ещё одно поле, иначе ничего не делать. Если знаете JS, то прекрасно меня поймёте. Если нет, то статей подобных у меня нет.

    Здравствуйте, у меня php выдает ошибки: [[ Warning: move_uploaded_file(images/img.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in I:hometest1.ruwwwloading.php on line 3 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘I:tmpphpF453.tmp’ to ‘images/img.png’ in I:hometest1.ruwwwloading.php on line 3 ]]

    Директории не существует, куда Вы отправляете файл.

    Народ у меня есть скрипт, но я не могу реализовать под php — помогите пожалуйста!

    Мне кто-нибудь поможет. Я даж заплачу за потраченное время!

    Михаил, а почему бы вам не сделать свой хостинг изображений специально для форума, чтобы люди могли загружать изображения и вставлять ссылку в сообщение на форуме? Было бы очень удобно а главное оригинально так как никто не додумается такое сделать и вы будете единственным с такой возможностью

    Идея не нова, но я так сделаю. Но всё это будет не раньше весны.

    Будет интересно посмотреть

    В статье ошибка, в самом начале, пропущена буква «О» в слове «видеОхостинги». Мелочь, конечно. 🙂

    У меня такая проблема: записываю файл на сервер, всё записывается нормально. Но если попытаться снова записать с тем же именем, то он не перезаписывается. Но время файла (атрибуты) обновляется. Не подскажете как быть?

    Всё должно перезаписываться, из-за чего такая ошибка — да миллиард причин могу придумать, даже больше. Первый вариант — невнимательность, перезаписываете на один и тот же файл. Второй вариант — попробуйте в другом браузере файл отправить. Остальные варианты уже сами придумывайте, их очень много. В общем, тут надо просто всё очень тщательно проверять. Вот ещё этот метод можно использовать: http://myrusakov.ru/php-finderror.html

    У меня получается что изображение с веб камеры сохраняется допустим с именем 123.jpg. если такого файла нет, то всё нормально. А если я хочу это фото обновить. То есть перезаписать по верх старого, он только атрибуты файла меняет. А само изображение не перезаписывает. У меня подозрение что я просто что то не так делаю. Может сперва старый файл удалить нужно?

    Попробуйте так, для удаления используйте unlink().

    Так и сделал. Всё получилось! Благодарю.

    У меня проблема такая: не могу загрузить на сервер. На всех папках стоит право доступа 777. Код: http://pastebin.com/p6Ash6BN

    Код ошибки какой?

    Михаил, такой вопрос. Фотография выводится на одной странице со ссылкой на статью, как сделать, так чтобы эта же картинка выводилась на странице со статьей??

    Здравствуйте Михаил, хотел спросить, делаю загрузку файлов,все работает пока не загружаю файл размер которого больше post_max_size = 8M, после нажатия кнопки массивов $_POST и $_FILES просто нет, как обрабатывать такие ошибки.

    Здравствуйте, Михаил! У меня вопрос: как сделать своё уникальное имя для каждого файла? То есть что бы не было такого, что бы два пользователя загрузили разные файлы с одинаковым именем.

    Генерировать это имя в PHP, например, используя это: http://myrusakov.ru/php-uniqid.html

    А может ли быть так, что функция uniqid вернет такой же ключ как и возвращал раньше?

    Чисто теоретически всё может быть, но на практике я думаю, что таких случаев не было.

    PHP: Copy, Rename or Move a File

    By Yang Yang
    Post date

    PHP can only copy, rename or move files that are of the same owner with who is running the PHP script. After making sure of this, you can proceed to:

    Copy a file to another place in PHP:

    Rename a file and give it a new name:

    Читать еще:  Php protected private

    Move a file to a new place in PHP:

    Apparently you must make sure the copying is successful before doing the deletion.

    Of course you can always execute a native Linux shell command such as ‘cp’ and ‘mv’ to do the dirty work for you instead of resorting to a PHP function. In this situation, you need the php function exec() to execute an external command.

    By Yang Yang

    Hello, I’m Yang. I build online businesses that please people. Want to join in and post some useful articles on Kavoir.com? Shoot me a message.

    17 replies on “PHP: Copy, Rename or Move a File”

    Hi, maybe you could help me with a problem i’m having, i need ti rename a file, with a specific name, how can i create a function that let do the following, if the file exist, rename the file with a new name like, document.php, document_2.php, document_3.php, document_4.php. i need to create a function to do that, when it renames a file rename it with the next number.

    Two and half years overdue but maybe it can help someone else. Amazing that I was just using this code. Maybe there’s a better way but I’ve used something similar so here’s a function to achieve that.

    $file = “/files/docs/document.php”;
    $file = rename_existing($file);

    returns full path with /document_1.php if it exists, or /document_2.php if document_1.php exists.
    Returns same filename if file doesn’t exist, Simple really

    //add _# to file name if exists
    function rename_existing($file) <
    $ext = strtolower(end(explode(“.”, basename( $file ))));
    $filename = basename($file, “.$ext”)
    $dir = str_replace(“$filename.$ext”, “”, $file);

    if(file_exists($dir . “$filename.$ext”)) <
    for ($i = 1; ; $i++) < //I don’t know why I used for instead of while
    $new_name = $dir . $filename . ‘_’ . $i . $ext;
    if (!file_exists($new_name)) <
    return $new_name;
    else< return $file; >

    Sorry, it’s untested but I’m sure it can be fixed or improved easily

    […] a matter of fact, scp works the exactly same way as an ordinary cp command except it’s able to copy files back and forth remote hosts. The “s” of “scp” stands for […]

    This is the simplist tutorial on file management iv’e seen so far.. Thanks for the help

    Thanks for valuable information

    Thank you! Copied your sample code and got it working immediately.

    You can easy move files with rename: rename(“/tmp/code.c”,”/usr/local/src/code.c”)

    its not working!!
    its saying failed to open stream
    help plzzz!

    check file path properly

    Hope it will work.

    Please go and read php documentation for “rename” . What are you doing.
    Look here.
    $file_c = “files/file_c.txt” ;
    rename($file_c,”/userfiles/file_b.txt”); // this will move the file .
    // why to copy and then unlink .

    What are you doing people , read documentation then post any posts.
    Php programmers have problems with this , somebody thinks that he knows something and he starts publishing wrong information .

    You are freacking right ! We should only read the more secure way is to do that…
    Is it not secure to delete after a copy?
    Rename function do this in background anyway… is it good to decompose steps to know exactly what problem ocur ?

    A complete document should be developed on this function…

    Функция Move_uploaded_file () не работает

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

    Это файл upload_file.php:

    Файл будет сохранен во временном месте, используйте имя tmp_name вместо имени

    Это рабочий пример.

    Форма HTML:

    Код PHP:

    Попробуйте использовать функцию copy() вместо move_uploaded_file() . Это сработало для меня.

    Проверьте, может ли uploads

    Возвращаемые значения

    Возвращает TRUE при успешном завершении.

    Если filename не является допустимым файлом загрузки, никаких действий не будет, и move_uploaded_file () вернет FALSE.

    Если filename является допустимым файлом загрузки, но по какой-либо причине его нельзя перемещать, никаких действий не будет, и move_uploaded_file () вернет FALSE. Кроме того, выдается предупреждение.

    Посмотрите на возвращаемое значение функции.

    возможно, вам нужно предоставить больше разрешений для ваших файлов.

    предположим, что ваш код находится под / var / www / my_project

    попробуйте chmod -R 777 /var/www/my_project

    ему это должно понравиться

    И вы не можете переместить его нигде в вашей системе. Вы можете переместить его только в каталог проекта, который должен находиться в htdocs или www, зависит от того, что вы используете wampp, lampp или vertrgo.

    Вы не ссылаетесь на временное место хранения файла.

    Используйте tmp_name для доступа к файлу.

    Вы всегда можете видеть, что происходит с помощью:

    Если вы увидите этот массив файлов, у вас будет лучшее понимание и представление о том, что происходит.

    Публикация этого отрезала, что я написал так, что если кто-то еще сюда приходит, захочет загрузить несколько файлов, он не вернется с пустыми руками. Этот скрипт не выполняет никакой проверки. Это просто прямое скачивание. Не стесняйтесь настраивать этот базовый код в соответствии с вашими потребностями.



    Если вы находитесь на машине с Windows, проблем с загрузкой или записью на указанный путь к папке не будет, кроме синтаксических ошибок.

    Но в случае пользователей Linux есть обходной путь к этой проблеме, даже если нет синтаксических ошибок.

    Прежде всего, я предполагаю, что вы используете это в среде Linux, и вам нужно загрузить что-то в папку проекта в общем каталоге.

    Даже если у вас есть доступ на запись и чтение к папке проекта, PHP не обрабатывается конечным пользователем. Это и может обрабатываться пользователем или группой www-data .

    Таким образом, чтобы этот www-data получил доступ к первому типу;

    после его завершения, если нет доступа на запись к следующему, а также;

    Это будет хитростью в Linux.

    Пожалуйста, не то, что это делается в среде Linux, с phpmyadmin и mysql.

    Ссылка на основную публикацию