Php переместить файл в другую папку

Обновлено: 01.07.2024

В этой статье объясняется, как переместить файл из одной папки в другую. Это может показаться сложным, но сделать это очень просто. Все, что вам нужно, это попрактиковаться в родной функции PHP rename. Его название подразумевает, что он работает путем переименования файла или каталога. Сначала это может сбить вас с толку, но переименование пути к файлу в конечном итоге перемещает его в новое место.

Используйте функцию rename() для перемещения файла в другую папку в PHP

Чтобы использовать функцию переименования, нам нужно указать исходное и целевое расположение файла, который нужно переместить. Исходное расположение — это текущий каталог, в котором хранится файл, а целевое расположение — это место, куда мы хотим переместить наш файл. Давайте обсудим это на примере!

Предположим, у нас есть два каталога с именами source_directory и dest_directory. У нас есть файл с именем move-test.txt в исходном_каталоге, и мы хотим переместить его в целевой_каталог с помощью PHP.

Давайте посмотрим на следующий код:

  1. Текущий путь к файлу указывается первым с помощью переменной $currentLocation .
  2. Затем указывается новое местоположение вместе с именем файла. Проще говоря, это новое место, куда мы хотим переместить наш файл.
  3. Если вы хотите дать файлу другое имя, это можно сделать, изменив имя файла move-test.txt в переменной $newLocation на новое имя файла.
  4. Функция переименования принимает два параметра: $currentLocation для пути к файлу перед операцией перемещения и $newLocation для нового пути к файлу после успешного перемещения в нужное место.

Важные соображения

  1. Перемещаемый файл должен существовать. Вы должны убедиться, что файл, который вы пытаетесь переместить, должен существовать. В противном случае будет выдано предупреждение о том, что системе не удается найти указанный файл.
  2. Существующий файл можно перезаписать. Функция переименования может привести к перезаписи существующего файла, что означает, что если $newLocation является именем некоторого существующего файла, то после операции перемещения с функцией переименования существующий файл будет перезаписан.

проверить, существует ли файл

Чтобы проверить, существует ли файл перед его перемещением в другую папку, вы можете использовать функцию is_file, предоставляемую PHP.

Пример кода для проверки существования файла с помощью функции is_file выглядит следующим образом:

В приведенном выше примере is_file($currentLocation) используется для проверки существования файла, который мы хотим переместить, перед вызовом функции переименования, которая выполняет операцию перемещения.

проверить, не перезаписан ли файл

Способ обеспечения того, чтобы существующий файл не перезаписывался при перемещении файла из одного места в другое, объясняется в следующем примере кода:

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

Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».

Статья по теме — PHP-файл


сообщить об этом объявлении

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

Параметры

Примечание.

Оболочка, используемая в from должна совпадать с оболочкой, используемой в to .

Примечание: в Windows, если он уже существует, он должен быть доступен для записи. В противном случае rename() завершается ошибкой и выдает E_WARNING .

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

Возвращает true в случае успеха или false в случае неудачи.

Примеры

См. также

  • copy() — копирует файл
  • unlink() — удаляет файл
  • move_uploaded_file() — перемещает загруженный файл в новое место.

Примечания, внесенные пользователями 26 примечаний

Сначала код, затем объяснение.

?>

Это не переименовывает файл в папке, как вы можете предположить, вместо этого он перемещает файл в любой рабочий каталог PHP. Скорее всего, вы не найдете его в дереве FTP. Вместо этого используйте следующее:

Из примечаний журнала изменений:

"Предупреждения могут быть сгенерированы, если целевая файловая система не разрешает системные вызовы chown() или chmod() для файлов, например, если целевая файловая система является файловой системой FAT."

В UNIX-подобных операционных системах файловые системы могут быть смонтированы с явным указанием uid и/или gid (например, с параметрами монтирования "uid=someuser,gid=somegroup").Попытка вызвать rename() с такой целевой файловой системой вызовет предупреждение «Операция не разрешена», даже если файл действительно переименован и rename() возвращает (bool) true.

Это не ошибка. Либо обработайте предупреждение в соответствии с вашим вариантом использования, либо вызовите функцию copy(), а затем unlink(), что позволит избежать обреченных вызовов chown() и chmod(), тем самым устраняя предупреждение.

Для тех, кто все еще не понимает, как работает rename() в Linux и Windows (Windows XP), когда целевой пункт назначения существует:

Я протестировал функцию rename($oldName, $targetName) в PHP 5.3.0 и PHP 5.2.9 на обеих ОС и обнаружил, что если файл с именем $targetName существует ранее, он будет перезаписан содержимым $oldName.

На самом деле, я почти уверен, что rename следует соглашению *nix rename(2) о перезаписи места назначения, если оно существует атомарно (это означает, что ни один другой процесс не увидит, что место назначения перестало существовать даже на мгновение). Это полезно, потому что позволяет вам создать файл как временный файл, а затем переименовать его в нужное вам место, и никто не увидит файл, когда он будет наполовину готов.

Вероятно, переименование ($old, $new) с существующим новым было вызвано проблемами с правами доступа. Бьюсь об заклад, другие проблемы, которые у вас были, были результатом того, что вы не вызвали clearstatcache(), что может привести к тому, что PHP будет вести себя так, как будто файл существует, хотя с тех пор он был удален.

- переименовать расширение файлов

changeext($directory, $ext1, $ext2, $verbose)

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

параметр 1: имя каталога
параметр 2: первое расширение, которое мы хотим заменить
параметр 3: новое расширение файлов

для простого использования вызовите функцию:
changeext('dir', 'html', 'php', 'false');

изменить имя каждого файла с расширением html на php в каталоге dir

функция changeext ($directory, $ext1, $ext2, $verbose = false) $num = 0;
if( $curdir = opendir ( $directory )) while( $file = readdir ( $curdir )) if( $file != '.' && $file != '..' )

$srcfile = $каталог . '/' . $ файл ;
$string = "$file";
$str = strlen ( $ext1 );
$стр++;
$newfile = substr ($string, 0, - $str);
$новый файл = $новый файл . '.' . $ext2 ;
$dstfile = $каталог . '/' . $ новый файл ;

if( is_dir ( $srcfile )) $num += changeext ( $srcfile , $ext1 , $ext2 , $verbose );
>
>
>
closedir ( $curdir );
>
вернуть $num ;
>

changeext('dir', 'html', 'php', 'false');

?>

чтобы удалить расширение файлов, просто оставьте параметр $ext2 пустым ''

Обратите внимание, что в Unix переименование — прекрасный способ получить атомарные обновления файлов.

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

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

О, и это работает только в том случае, если у вас есть временный файл и файл назначения в одной и той же файловой системе (например, раздел/жесткий диск).

Если вы случайно получите что-то похожее на это:

('/foo/bar', '/foo/bar');
?>

Возвращает true. Это не задокументировано.

Примечание к примечанию "php at stock-consulting dot com":
Это зависит от операционной системы.
В системах Windows вы не можете переименовать файл в существующее место назначения (хорошо , с инструментами можно, но они отвязывают существующий раньше).

rename() работает в Linux/UNIX, но не работает в Windows в каталоге, содержащем файл, ранее открытый в том же скрипте. Проблема сохраняется даже после правильного закрытия файла и очистки буфера.

Вставка команды sleep() перед переименованием решает проблему.

= fopen( "./dir/ex.txt", "r+");
$text = fread ( $fp , размер файла ("../dir/ex.txt" ));
ftruncate ( $fp , 0 );
$text2 = "некоторое значение" ;
fwrite ($fp, $text2);
flush ( $fp );
fclose ( $fp );
if ( is_resource ( $fp ))
fclose ( $fp );
спать ( 1 ); // это помогает
переименовать ( "./dir" , ".dir2" ); //нет ошибки
?>

Важное примечание: функция rename() НЕ работает для *каталогов* в разных файловых системах или устройствах. Только *файлы*

Вы получите два предупреждения:
"Предупреждение PHP: rename(): первый аргумент функции copy() не может быть каталогом в строке "
"Предупреждение PHP: rename(t2,/ var/run/test/t2): Неверная ссылка на кросс-устройство в строке "

Единственным обходным путем, который я считаю сейчас, является использование PHP copy($source, $dest), а затем в случае успеха, PHP unlink($source) или выполнение system("mv $source $dest"), что является обманом, и должны быть заключены в кавычки для путей с пробелами или другими метасимволами оболочки и, возможно, экранированы в целях безопасности.

rename() не работает с PHP4 и PHP5 под Windows, если целевой файл существует, независимо от настроек прав доступа к файлу. Теперь я использую функцию, похожую на функцию ddoyle [at] canadalawbook [dot] ca, которая сначала пытается переименовать(), проверяет, вернуло ли оно FALSE, а затем использует copy()/unlink(), если это не удалось.

Однако функция copy(), в отличие от rename(), НЕ пригодна для "атомарных обновлений". Другой процесс может получить доступ к целевому файлу, пока работает функция copy(). В таком случае другой процесс воспринимает файл как пустой или с неполным содержимым ("наполовину написанный").

Обратите внимание, что это НЕ РАБОТАЕТ, если вы пытаетесь переименовать каталог в общий сетевой ресурс.

например.
переименовать('/home/user/me/dir1', '/mnt/shares/nfsmount/dir2')

создаст в общей папке файл с именем 'dir2', а не каталог.

Это меня зацепило, и моим (самым быстрым) решением было использование команд exec и mv:

= 'mv "/home/user/me/dir1" "/mnt/shares/nfsmount/dir2"' ;
exec ($cmd, $output, $return_val);

if ( $return_val == 0 ) <
echo "успех" ;
> else <
echo "сбой" ;
>
?>

Здравствуйте!
Для пользователей unix/linux: полезно знать, что если вы используете rename() для каталога, новый каталог будет создан с текущим umask!

в Windows (XP, Vista, 7.) http://fr.wikipedia.org/wiki/Windows-1252", если имя вашего файла содержит ударение, оно не работает в основном. Поэтому используйте функцию iconv для преобразования от utf-8 до cp1252, как показано ниже:
= iconv ("UTF-8", "CP1252", "C:\\wamp\\www\\tést.txt");
$nomfichierfinal = "C:\\wamp\\www\\test.txt" ;
переименовать ( $nomfichierinitial , $nomfichierfinal );
?>

Начиная с PHP 5.1.4, скомпилированного на Mac, при переименовании с пробелами нужно просто использовать пробел. Возьмем, к примеру:

переименовать("/tmp/somefile.tar", "/mnt/хранилище ноутбука/somefile.tar");

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

переименовать("/tmp/somefile.tar", "/mnt/laptop\ storage/somefile.tar");

Хотя на самом деле это не ошибка, это немного смутило меня при работе над скриптом резервного копирования.

Неясно, какую кодировку должны иметь аргументы переименования; Для PHP 4.3 в файловых системах HFS+ функция rename() не обрабатывала строки UTF-8 и возвращала ошибку.

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

$rem = $_GET['file'];
$ticket = uniqid(rand(), true);

вывод выглядит следующим образом: 6881432893ad4925a1.70147481filename.txt

Это также поможет, если вы хотите сохранить разные версии файла.

Это было забавно: в Win XP при переименовании выдается сообщение "разрешение определено", если вы пытаетесь переименовать тома. Например, rename("c:\windows\temp\x.txt", "g:\ пункт назначения") не удастся.

Если вы используете SplFileObject для того же файла, который
вы хотите переименовать, вы должны сначала удалить объект SplFileObject.

= 'testFile.txt' ;
$fileObj = новый SplFileObject ( $filePath );
переименовать ($filePath, 'newName.txt');

// Вы получите сообщение об ошибке "Отказано в доступе"

$filePath = 'testFile.txt';
$fileObj = новый объект SplFileObject ('filePath.txt');
$fileObj = null ;
переименовать ($filePath, 'newName.txt');

// и теперь это работает.
?>

rename() определенно не следует соглашению о переименовании *nix в WinXP с PHP 5. Если $newname существует, он вернет FALSE, а $oldname и $newname останутся в исходном состоянии. Вместо этого вы можете сделать что-то вроде этого:

функция rename_win($oldfile,$newfile) if (!rename($oldfile,$newfile)) if (copy ($oldfile,$newfile)) unlink($oldfile);
вернуть ИСТИНА;
>
вернуть ЛОЖЬ;
>
вернуть ИСТИНА;
>

Как описано на странице unlink():
Вы должны освободить все дескрипторы файла, прежде чем сможете его переименовать (правда, по крайней мере, в Windows).
Это НЕ будет работать, вы будут получать ошибки отказа в разрешении:
= fopen ('tempFile.txt', 'r');
переименовать ('tempFile.txt', 'tempFile2.txt'); // Доступ запрещен!
?>

Просто закройте дескриптор, чтобы исправить это:
= fopen ( 'tempFile.txt' , 'r' );
fclose ( $fileHand );
переименовать ('tempFile.txt', 'tempFile2.txt');
?>

Некоторое время я ломал голову, так как дескриптор был открыт вверху функции поля, а переименование было внизу.

Функция rename(), по-видимому, не перемещает файлы размером более 4 ГБ, даже несмотря на то, что файловая система поддерживает 32-разрядную операционную систему.

Протестировано здесь с PHP 5.5.9 (x86), в среде Linux (Ubuntu 14.04.5 LTS i686), с исходным файлом (файл RAR 60 ГБ) в файловой системе ext4, а местом назначения является внешний жесткий диск с файловой системой NTFS. Было скопировано только 4 ГБ, а RAR был поврежден: «Неожиданный конец архива».

Не проверено, может ли функция rename() перемещать файлы размером более 4 ГБ в 64-разрядной среде.

Если $oldname и $newname являются существующими жесткими ссылками, ссылающимися на один и тот же файл, функция rename() ничего не делает и возвращает статус успешного выполнения.
(из руководства по базовой libc rename())
С другой стороны, "/bin/mv старое имя новое имя" приводит к удалению "старого имени".

[Примечание редактора: это работает, потому что SplFileObject имеет метод __toString(), который возвращает путь к файлу]

Обратите внимание, что вы можете передать объект SplFileInfo в качестве любого аргумента:

переименовать ('foo', новый SplFileInfo ('bar'));

переименовать (новый SplFileInfo ('bar'), 'foo');

Этот код переименовывает все файлы и папки в определенном каталоге в нижний регистр:

функция getDirectory ($path = '.', $level = 0)

$dh = @ opendir ($path);

while( false !== ( $file = readdir ( $dh )) )
if( ! in_array ( $file , $ignore ))
$spaces = str_repeat ( ' ' , ( $ уровень * 4 ) );
if( is_dir ("$path / $file" ))
echo "$spaces $file
" ;
rename ( $path . "\\" . $file , strtolower ( $path . "\\" . $file ));
getDirectory("$path/$file", ($level+1));

>
else echo " $spaces $file
" ;
rename ( $path . "\\" . $file , strtolower ( $path . "\\" . $file ));
>
>
>
closedir ( $dh );
>

getDirectory ($path, 0)

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

Не то, что я ожидал.

[pearcec@abe tmp]$ mkdir test1
[pearcec@abe tmp]$ mkdir test2
[pearcec@abe tmp]$ touch test1/test
[pearcec@abe tmp] $ php
("test1", "test2");
?>
X-Powered-By: PHP/4.0.5
Тип контента: text/html

[pearcec@abe tmp]$ ls -al
всего 12
drwxr-xr-x 3 pearcec commnav 4096 15 июня 13:17 .
drwxr-xr-x 18 pearcec commnav 4096 15 июня 13:15 ..
drwxr-xr-x 2 pearcec commnav 4096 15 июня 13:16 test2
[pearcec@abe tmp]$ ls -la test2/
всего 8
drwxr-xr-x 2 pearcec commnav 4096 15 июня 13:16 .
drwxr-xr-x 3 pearcec commnav 4096 15 июн 13:17 ..
-rw-r--r-- 1 pearcec commnav 0 15 июн 13:16 test
[pearcec@ abe tmp]$

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

Параметры

Имя загруженного файла.

Место назначения перемещенного файла.

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

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

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

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

Примеры

= '/uploads' ;
foreach ( $_FILES [ "изображения" ][ "ошибка" ] as $key => $error ) if ( $error == UPLOAD_ERR_OK ) $tmp_name = $_FILES [ " картинки" ][ "tmp_name" ][ $key ];
// basename() может предотвратить атаки обхода файловой системы;
// может потребоваться дополнительная проверка/очистка имени файла
$name = basename ( $_FILES [ "pictures" ][ "name" ][ $key ]);
move_uploaded_file ($tmp_name, "$uploads_dir / $name");
>
>
?>

Примечания

Примечание:

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

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

См. также

Пользовательские заметки 40 заметок

Советы по безопасности, которые вы должны знать перед использованием этой функции:

Во-первых, убедитесь, что файл не пустой.

Во-вторых: убедитесь, что имя файла состоит из английских букв, цифр и символов (_-.) для большей защиты.

Вы можете использовать функцию ниже, как в примере

/**
* Check $_FILES[][name]
*
* @param (string) $filename — имя загруженного файла.
* @author Yousef Ismaeil Cliprz
*/
function check_file_uploaded_name ( $filename )
(bool) (( preg_match ( "`^[-0-9A-Z_\.] +$`i" , $filename )) ? true : false );
>

?>

Третье: убедитесь, что имя файла не превышает 250 символов.

/**
* Проверить длину $_FILES[][name].
*
* @param (string) $filename - Имя загруженного файла.
* @author Yousef Ismaeil Cliprz.
*/
функция check_file_uploaded_length ( $filename )
return (bool) (( mb_strlen ( $filename , "UTF-8") > 225 ) ? true : false );
>

или вы можете использовать регулярное выражение для проверки расширений файлов, как в примере

или используйте проверку in_array как

= массив( 'gif' , 'jpg' , 'jpe' , 'jpeg' , 'png' );

?>

У вас есть несколько вариантов проверки расширений и типов Mime.

Вы можете использовать .htaccess, чтобы остановить работу некоторых скриптов, например, файл php в пути загрузки.

AddHandler cgi-script .php .pl .jsp .asp .sh .cgi
Параметры -ExecCGI

Не забывайте об этих шагах для защиты вашего проекта.

Для тех, кто использует PHP в Windows и IIS, вам СЛЕДУЕТ установить значение «upload_tmp_dir» в php.ini для некоторого каталога, где находится каталог ваших веб-сайтов, создать этот каталог, а затем установить для него те же разрешения, которые вы установили. для вашего каталога веб-сайтов. В противном случае, когда вы загружаете файл и он попадает в C:\WINDOWS\Temp, а затем вы перемещаете его в каталог своего веб-сайта, его разрешения не будут установлены правильно. Это вызовет у вас проблемы, если вы затем захотите манипулировать этим файлом с помощью чего-то вроде утилиты конвертации ImageMagick.

Для тех, кто будет использовать инструменты inotify для запуска события, когда move_uploaded_file помещает файл в определенный каталог, имейте в виду, что move_uploaded_file вызовет событие создания, а не событие перемещения инструментов inotify.

nouncad на сайте mayetlite.com опубликовал функцию, которая загружала файл и переименовывала его, если он уже существовал, в имя_файла[n].ext

Это работало только для файлов с расширениями длиной ровно три буквы, поэтому я исправил это (и сделал несколько других улучшений, пока работал над этим).

// Использование: uploadfile($_FILE['file']['name'],'temp/',$_FILE['file']['tmp_name'])
функция uploadfile ( $origin , $dest, $tmp_name)
$origin = strtolower (базовое имя ($origin));
$fulldest = $dest . $ происхождение ;
$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)). '[' . $я. ']' . $fileext;
$fulldest = $dest . $ новое имя файла ;
>

if ( move_uploaded_file ( $tmp_name , $fulldest ))
return $filename ;
вернуть false ;
>
?>

Просто полезный комментарий. Если у вас установлен open_basedir, вы должны установить upload_tmp_dir где-то внутри open_basedir. В противном случае загрузка файла будет отклонена. move_uploaded_file может поддерживать open_basedir, но остальная часть процесса загрузки — нет.

Если вы имеете дело с файлами, загруженными через какой-либо внешний FTP-источник, и вам нужно переместить их в конечный пункт назначения, поиск на php.net слов «mv» или «move» не даст вам желаемого. Вам нужна функция rename().

(move_uploaded_file() не будет работать, так как не будут присутствовать переменные POST.)

move_uploaded_file (в моей настройке) всегда делает файлы 0600 ("rw- --- ---") и принадлежат пользователю, запустившему веб-сервер (владелец И группа).
Несмотря на то, что каталог имеет липкое бит установлен для групповых разрешений!
Я не смог найти никаких настроек, чтобы изменить это через php.ini или даже с помощью «umask()».

Я хочу, чтобы мой обычный пользователь на сервере мог "смолить cjf" каталог .. что не удалось бы с файлами, полностью принадлежащими пользователю веб-сервера-процесса;
"копировать (из, в) " функция подчиняется липкому биту!

Для nouncad на сайте mayetlite.com,

Для меня лучше всего будет проанализировать имя загруженного файла ($_FILES['uploadedfile']['name']) на основе наличия точек. Еще одна проблема: в имени файла могут быть точки. С этим достаточно просто справиться — просто взорвите() имя файла и надейтесь, что последний элемент в массиве, который он вам даст, — это расширение файла (вы всегда можете проверить его, если хотите). Затем просто соедините его в строку соответствующим образом, пройдясь по массиву (не забудьте добавить эти точки туда, где они были!), добавив гарантированную уникальную строку символов (или перечислите ее, как вы это делали, отслеживая через цикл) и, наконец, добавление расширения файла.

У вас могут быть другие механизмы для проверки расширения файла, такие как preg_match для всего имени, используя что-то вроде "/\\.(gif|jpg|jpeg|png|bmp)$/i" (подробнее можно, конечно, если хотите, добавьте) для наиболее распространенных типов изображений, которые можно найти в Интернете.

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

Похоже, что move_uploaded_file использует разрешения GROUP родительского каталога расположения файла tmp, тогда как простая «копия» использует группу процесса apache. Это может создать угрозу безопасности, если местоположение вашего файла tmp принадлежит пользователю root:wheel

точка только точка буря в gmail точка ком написал:
>
> В дополнение к проверке расширения файла. Простой способ
> получения расширения (независимо от размера):
>
> $efilename = Explosion('.', $filename);
> $ext = $ efilename[количество($efilename) - 1];
>

class UploadTool <
/**
* @var arr => $upload_info = infos sobre os arquivos enviados
*/
private $upload_info = array();
/**
* @param str => $input_name = имя для ввода
* @param str => $folder_to_move = имя для пасты, которую вы хотите сохранить
* @param arr => $mime_allowed = типы MIME разрешены без процесса загрузки
* @param bol => $return_json = se true retorna um objeto json
*/
public function manage_single_file (string $ input_name , string $folder_to_move , array $mime_allowed = [], bool $return_json = true ) <
$resultado = array();
$count_mime_allowed = количество ( $mime_allowed );
if( is_uploaded_file ( $_FILES [ $input_name ][ 'tmp_name' ])) <
$new_name_file = bin2hex ( random_bytes ( 64 )). '.' . pathinfo ( $_FILES [ $input_name ][ 'имя' ], PATHINFO_EXTENSION );
$this -> upload_info = array(
'name' => $new_name_file ,
'size' => $_FILES [ $input_name ][ 'size' ],
' mime' => finfo_file ( finfo_open ( FILEINFO_MIME_TYPE ), $_FILES [ $input_name ][ 'tmp_name' ]),
'extension' => pathinfo ( $_FILES [ $input_name ][ 'name' ], PATHINFO_EXTENSION ),
'check_mime' => true ,
'folder_to_move' => $folder_to_move ,
'error_code' => $_FILES [ $input_name ][ 'error' ],
);
if($count_mime_allowed > 0 && ! in_array ($this -> upload_info ['mime'], $mime_allowed, true)) < $this ->upload_info ['check_mime'] = false;>
if( $this -> upload_info [ 'код_ошибки' ] === 0 && $this -> upload_info [ 'check_mime' ] === true ) < move_uploaded_file ( $_FILES [ $input_name ][ 'tmp_name' ], $folder_to_move . $this ->upload_info [ 'name' ]);>
>
$resultado [ 'upload_info' ] = $this -> upload_info ;
if( $return_json )
if(! $return_json )
>
/**
* @param str => $input_name = имя ввода
* @param str => $folder_to_move = имя пасты, которую вы хотите сохранить,
* @param arr => $mime_allowed = типы mime, разрешенные без процесса загрузки
* @param bol => $ return_json = se true retorna um objeto json
*/
public function manage_multiple_file (string $input_name , string $folder_to_move , array $mime_allowed = [], bool $return_json = true ) <
$resultado = массив();
$count_mime_allowed = количество ( $mime_allowed );
$qtd_arquivos_enviados = count ( $_FILES [ $input_name ][ 'tmp_name' ]);
for( $i = 0 ; $i $qtd_arquivos_enviados ; $i ++) <
if( is_uploaded_file ( $_FILES [ $input_name ][ 'tmp_name' ][ $i ])) <
$new_name_file = bin2hex ( random_bytes ( 64 )). '.' . pathinfo ( $_FILES [ $input_name ][ 'имя' ][ $ i ], PATHINFO_EXTENSION );
$this -> upload_info [] = array(
'name' => $new_name_file ,
'size' => $_FILES [ $input_name ][ 'size' ][ $i ] ,
'mime' => finfo_file ( finfo_open ( FILEINFO_MIME_TYPE ), $_FILES [ $input_name ][ 'tmp_name' ][ $i ]),
'extension' => pathinfo ( $_FILES [ $input_name ][ 'имя' ][ $i ], PATHINFO_EXTENSION ),
'check_mime' => true ,
'folder_to_move' => $folder_to_move ,
'error_code' => $_FILES [ $ input_name ][ 'ошибка' ][ $i ],
);
if( $count_mime_allowed > 0 && ! in_array ( $this -> upload_info [ $i ][ 'mime' ], $mime_allowed , true )) < $this ->upload_info [ $i ][ 'check_mime' ] = false ;> ​​
if( $this -> upload_info [ $i ][ 'error_code' ] === 0 && $this -> upload_info [ $i ][ 'check_mime' ] === true ) < move_uploaded_file ( $_FILES [ $input_name ][ 'tmp_name' ][ $i ], $folder_to_move . $this ->upload_info [ $i ][ 'name' ]);>
>
>
$resultado [ 'upload_info' ] = $this -> upload_info ;
if( $return_json )
if(! $return_json )
>
>
if( $_FILES ) <(new UploadTool )->manage_multiple_file ('input_arquivos' , __DIR__ .'/pasta/' );>
?>

Очевидно, вышеприведенное предупреждение лучше было бы написать так: «Если целевой файл уже существует, он будет перезаписан независимо от разрешений для целевого файла».

Другими словами, move_uploaded_file() выполняется так, как если бы он был пользователем root, а не пользователем, под которым работает веб-сервер, или владельцем выполняемого скрипта.

Я получал код ошибки 1 (http://www.php.net/manual/en/features.file-upload.errors.php), указывающий на то, что размер файла превышает upload_max_filesize. Чтобы это исправить, запустите ( "upload_max_filesize", "100M" ); ?> (затем перезапустите apache), изменив второй аргумент на свой предел.

В течение нескольких лет я никак не мог понять, как эффективно загружать изображения (размером более 2 МБ), а затем создавать эскизы.Моя заметка ниже об общей загрузке файлов была ранним намеком на некоторые из системных ограничений по умолчанию, и я недавно обнаружил последнее ограничение, которое я предлагаю в качестве примера различных недостающих фрагментов информации для успешной загрузки изображений размером более 2 МБ, а затем создания эскизы. В этом конкретном примере предполагается, что изображение пользователя загружается, и из-за кэширования браузера требуется уникальный номер в конце, чтобы браузер загружал новое изображение для просмотра во время загрузки. Общая вызывающая программа, которую я использую, представляет собой приложение на основе Flex, которое вызывает этот php-файл для загрузки эскизов пользователей.

Секрет соуса:

<р>1. отрегулируйте размер памяти сервера, размер загружаемого файла и размер сообщения
2. преобразовать изображение в стандартный формат (в данном случае jpg) и масштабировать

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

файл htaccess:
php_value post_max_size 16M
php_value upload_max_filesize 6M

// $img_base = базовая структура каталога для миниатюр
// $w_dst = максимальная ширина миниатюры
// $h_dst = максимальная высота миниатюры
// $n_img = new имя миниатюры
// $o_img = имя старой миниатюры
функция convertPic ($img_base, $w_dst, $h_dst, $n_img, $o_img)
< ini_set ('memory_limit', '100M' ); // обрабатывать большие изображения
отсоединить ( $img_base . $n_img ); // удалить старые изображения, если они есть
unlink ( $img_base . $o_img );
$new_img = $img_base . $n_img ;

$file_src = $img_base . "img.jpg" ; // временное безопасное хранилище изображений
unlink ( $file_src );
move_uploaded_file ( $_FILES [ 'Данные файла' ][ 'tmp_name' ], $file_src );

список($w_src, $h_src, $type) = getimagesize($file_src); // создаем новые размеры, сохраняя соотношение сторон
$ratio = $w_src / $h_src ;
если ($w_dst / $h_dst > $ratio) < $w_dst = пол ($h_dst * $ratio);>else < $h_dst = пол ($w_dst / $ratio);>

switch ( $type )
jpg
$img_src = imagecreatefromgif ( $file_src );
перерыв;
случай 2: // jpeg -> jpg
$img_src = imagecreatefromjpeg ( $file_src );
перерыв;
случай 3: // png -> jpg
$img_src = imagecreatefrompng ( $file_src );
перерыв;
>
$img_dst = imagecreatetruecolor ( $w_dst , $h_dst ); // повторная выборка

imagecopyresample ( $img_dst , $img_src , 0 , 0 , 0 , 0 , $w_dst , $h_dst , $w_src , $h_src );
imagejpeg ($img_dst, $new_img); // сохранить новое изображение

отключить ( $file_src ); // очистить хранилище изображений
imagedestroy ( $img_src );
imagedestroy ( $img_dst );
>

$p_id = (Целое число) $_POST [ uid ];
$ver = (Integer) $_POST [ver];
$delver = (Целое число) $_POST [ delver ];
convertPic("ваш/файл/структура/" , 150 , 150 , "u" . $p_id . "v" . $ver. ".jpg", "u" . $p_id . "v" . $ delver. ".jpg" );

В этом руководстве мы покажем вам, как переместить файл с помощью PHP.

Для этого мы будем использовать встроенную в PHP функцию переименования. Как следует из названия, эта функция переименовывает заданный файл или каталог.

Пусть вас не смущает название функции. Переименовывая путь к файлу, мы фактически перемещаем его.

Для этого руководства мы создадим два каталога с именами directory_a и directory_b.

В каталоге_a у нас есть текстовый файл с именем sample-file.txt.

С помощью PHP мы собираемся переместить файл-образец.txt из каталога_a в каталог_b.

Взгляните на следующий пример.

В приведенном выше коде.

  1. Мы указали путь к текущему файлу. Это файл, который мы хотим переместить.
  2. После этого мы указали новый путь к файлу. Это путь и имя файла, которые мы хотим, чтобы наш новый файл имел. Другими словами, это то место, куда мы хотим его переместить. Обратите внимание: если вы хотите присвоить ему другое имя файла, вы можете просто изменить сегмент «sample-file» переменной $newFilePath на что-то другое.
  3. Чтобы переместить файл, мы использовали функцию переименования PHP. Функция переименования PHP принимает $currentFilePath в качестве первого параметра ($oldname) и $newFilePath в качестве второго параметра ($newname).
  4. Если перемещение прошло успешно, переименование вернет логическое значение TRUE.

Функция переименования перезапишет существующие файлы!

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

Поэтому вам может потребоваться осторожность при перемещении файлов вслепую.

Файл, который вы хотите переместить, должен существовать.

Если $currentFilePath не существует, будет выдано следующее предупреждение PHP.

"Предупреждение: система не может найти указанный файл."

Для защиты от подобных проблем вы можете использовать функцию PHP is_file, чтобы проверить, существуют ли файлы или нет, прежде чем пытаться их переместить.

Пример кода, показывающий, как это может выглядеть.

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

Читайте также: