Acasă / Prezentare generală Linux / Php funcționează - Creați un folder dacă nu există deja. Funcția Mkdir în PHP, descriere și exemple Php creând un folder dacă acesta nu există

Php funcționează - Creați un folder dacă nu există deja. Funcția Mkdir în PHP, descriere și exemple Php creând un folder dacă acesta nu există

Funcția mkdir() creează un folder nou în directorul specificat. Dacă crearea are succes, returnează True. Când creați un folder nou, puteți seta drepturi de acces la acesta folosind parametrul $mode. Setând $recursive la True, puteți crea mai multe subdosare.

PHP versiunea 4 și superioară.

funcția bool mkdir(șir $pathname [, int $mode [, bool $recursiv [, resursă $context]]])

parametrii funcției mkdir

$pathnameCalea către directorul care urmează să fie creat.
$modeDrepturile la folderul creat Drepturile sunt atribuite ca valoare octală cu un zero obligatoriu în primul rând (0777). În afară de primul zero, numerele reprezintă niveluri de acces pentru proprietar, pentru grupul proprietarului, pentru toți ceilalți.
Nivelul de acces este determinat de numerele:
0 – acces refuzat;
1 – acces la citire;
2 – acces la scriere;
4 – acces la execuție.
Cel mai adesea, drepturile sunt specificate ca o sumă compusă, de exemplu:
7 – acces complet (1+2+4);
5 – citire și execuție (1+4).
Valoarea implicită este 0777.
$recursivUn parametru boolean care determină dacă pot fi create subdirectoare imbricate.
$contextFolosit atunci când lucrați cu fluxuri. Adăugat în PHP 5.0.0.

Exemple de utilizare a funcției mkdir

mkdir( „folder nou”);

mkdir( „../folder nou” ); // un nivel mai jos

mkdir("/folder1/folder2/newfolder"); // cale completă

mkdir( „folder nou”, 0777); // creează un folder cu drepturi atribuite

Dacă trebuie să creați mai multe subfoldere, trebuie să setați $recursive = True.

mkdir("folder1/folder2/newfolder" , 0777, True ); // creează un folder în directorul curent


Publicarea acestui articol este permisă numai cu un link către site-ul web al autorului articolului

În acest articol, voi descrie o opțiune pentru a rezolva problema creării de foldere folosind phpîn modul sigur.
Pentru a crea un folder în PHP, există o funcție standard mkdir(), dar în majoritatea cazurilor se dovedește a fi inutilă și mulți oameni știu despre el, dar nu mulți știu că puteți rezolva această problemă.
Totul este foarte simplu, trebuie să creați foldere folosind sistemul încorporat funcții php FTP.
Mai jos scriu despre asta mai detaliat.

Probleme cu mkdir() la crearea unui folder.
După cum știți, dacă este activat în php modul sigur(safe_mode = on), apoi crearea de foldere (directoare) folosind mkdir() nu va funcționa. Pentru a fi mai precis, îl puteți crea, dar utilizarea ulterioară a acestui folder va fi imposibilă. Nu veți putea încărca fișiere în acest folder, nu îl veți putea redenumi și nu îl veți putea șterge, chiar dacă vă conectați prin FTP (în unele cazuri puteți șterge prin FTP).

Modul sigur este activat în mod implicit pe toate serverele și pe toți furnizorii de găzduire. Dacă nu aveți opțiunea de a dezactiva modul sigur, există o altă cale de ieșire.

Crearea de foldere în php folosind FTP.
Aproape toate serverele și găzduirea au suport ftp activat în php.
Cu ajutorul acestor funcții vom rezolva problema creării folderului mkdir().
Un exemplu de creare a unui folder prin FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // se conectează la serverul FTP
if($conn_id) // dacă conexiunea la server a avut succes, continuați
{
$login_result = @ftp_login($conn_id, „user”, „pass”); // introduceți numele și parola pentru FTP
if($login_result) // dacă serverul a acceptat parola de conectare, mergeți mai departe
{
// acum trebuie să te joci cu modul pasiv, să-l pornești sau să-l dezactivezi (adevărat, fals)
// dacă alte funcții ftp nu funcționează corect, încercați să schimbați acest parametru (TRUE sau FALE)
ftp_pasv($conn_id, TRUE); // în acest caz, modul pasiv este activat
ftp_mkdir($conn_id, "1/2/3"); // și crearea folderului în sine
}
}
ftp_close($conn_id); // și închideți conexiunea FTP
?>
Acum, nu este un comentariu mare asupra codului.
Prima linie se conectează la serverul FTP. De obicei, pentru a vă conecta la un server FTP local, este suficient să specificați localhost ca server, dar puteți specifica și adresa completă.
Dacă modul pasiv este activat sau dezactivat, depinde de setările FTP.

Când creați un folder, aveți grijă, folderul este creat din rădăcina de conectare FTP. Adică căile de aici sunt diferite de cărări sistem de fișiere iar folderul este creat așa cum se vede prin FTP.
Dacă la crearea unui folder specificați mai multe atașamente, ca în exemplul meu „1/2/3”, atunci în acest caz vor fi create toate folderele lipsă. Dacă nu există folderul „1”, acesta va fi creat, iar în el va fi creat folderul „2”, iar în el va fi creat folderul „3”. Dacă folderele intermediare există deja, atunci vor fi create doar cele lipsă.
Înainte de a crea un folder, vă puteți muta într-un dosar, de exemplu


Și după această funcție puteți crea un folder. Dacă calea către folder este specificată ca „2/3” fără bara oblică, atunci folderul va fi creat în raport cu folderul în care ne aflăm în prezent. Adică va fi creat folderul „1/2/3”.


Dacă specificați o bară oblică (/1/2/3) când creați un folder, folderul va fi creat din rădăcina FTP, indiferent de folderul în care v-ați mutat.

Comentarii

14.10.2009 Serghei
totul ingenios este simplu :)

12.12.2009 Victor
Mulțumesc, totul funcționează, dar în clientul ftp folderele create nu sunt vizibile imediat, trebuie să-l reporniți, adică. nu vă deconectați doar de la server și conectați-vă din nou, ci închideți programul și rulați-l din nou (folosesc FileZilla Client).

14.12.2009 Admin
Cred că asta-i tot Clienți FTP cache fișiere și foldere. De exemplu, în Total Commander există un buton special de „actualizare” pentru astfel de chestiuni, este păcat că FileZilla nu are acest lucru.

24.01.2010 Alexandru
Cum de nu există așa ceva în FileZilla, am versiunea 3.2.2, are deja aproximativ un an și există o astfel de funcție și din câte îmi amintesc a fost întotdeauna!!!

27.08.2010 Vitaly
Folderele sunt create cu 755 în dreapta, dar aveți nevoie de 777.
În etapa de creare, este posibil să configurați cumva ce drepturi va fi creat folderul prin FTP?

27.08.2010 Admin
Vitaly, există o funcție pentru asta
ftp_chmod($conn_id, 0777, $fișier)
după crearea unui folder sau fișier, utilizați-l

28.08.2010 Vitaly
multumesc, admin!

09.12.2010 Andrei
Scuzați-mă, de ce nu creez mai multe directoare, adică:

12.06.2011 Ilya
Ceva nu merge bine. Problemele serverului:
Avertisment: ftp_close() se așteaptă ca parametrul 1 să fie resursă, boolean dat în /home/bos/p/h/p/phpscripts/public_html/formf.php pe linia 19

15.06.2011 Victor
Ilya, el scrie că primul parametru pe care îl treceți la funcția ftp_close nu este corect

29.06.2011 Alexey
Aceeași problemă ca Andrei
(nu sunt create mai multe directoare)
ftp_mkdir ($conn_id, "1"); // așa funcționează
dar ca acesta ftp_mkdir ($conn_id, "1/2/3" // nu funcționează).
???

27.07.2011 Victor
Alexey, ciudat, am verificat, îmi creează mai multe foldere.
Poate că un mod complicat este activat pe server, apoi trebuie să creați foldere unul câte unul, mai întâi să creați folderul 1, apoi să îl introduceți și să creați folderul 2 în el, apoi să introduceți folderul 2 și să creați 3 în el...

11.07.2011 k1-801 (Dmitry este posibil)
Și să șterg foldere, din câte am înțeles, prin
rmdir_ftp($conn_id, $dir);
Aşa?

Și, apropo, din anumite motive nu îmi creează un folder (și nu scrie erori... ciudat...)

03.10.2012 IA
Multumesc, in rest am fost chinuit de aceasta intrebare.
iar tu ierți totul și principalul lucru este că funcționează

29.05.2012 Mihail
Desigur, îmi pare rău. Unde ar trebui să scriu acest cod, altfel nu mă pricep deloc la el, dar chiar trebuie să creez un folder))

07.04.2012 Nomaq
Ceva nu e în neregulă cu mine... prima dată când codul omite, a doua oară scrie că un astfel de folder deja există... se pare că se creează, dar nu este vizibil nici după repornirea FTP((((
și, de asemenea, trebuie să creez un folder care nu se află în același folder în care este fișierul PHP, dar să merg înapoi cu un pas, apoi să intru un alt folder și să-l creez acolo.. ceva de genul acesta:
../folder1/new folder aici
va rog ajutati, daca nu e greu) multumesc)

07.04.2012 Nomaq
Mi-am dat seama căile))) mulțumesc în general pentru articol, este rar ca cineva să explice cum se face)))

27.01.2013 CiliZ
Bravo, respect pentru articol

06.05.2013 Vasily
Dosarul corporativ este elementul principal identitate corporativă companiilor. Este un produs pentru atașarea unor cantități mici de documente și materiale de hârtie. Folderele sunt folosite atât în ​​cadrul unei companii, pentru stocarea și mutarea documentației, cât și în scop publicitar. Mai multe detalii pe site: www.logodesigner.ru/papki

eliminați etichetele (12)

Am întâlnit mai multe cazuri cu instalări WordPress de la Bluehost în care am întâlnit erori în tema mea WordPress deoarece lipsea folderul de încărcări wp-content/uploads.

Se pare că programul de instalare Bluehost cPanel WP nu creează acest folder, deși HostGator o face.

Așa că trebuie să adaug cod la tema mea care verifică folderul și îl creează altfel.

Răspunsuri

Încercați asta:

Dacă (!file_exists("cale/către/director")) ( mkdir("cale/către/director", 0777, adevărat); )

Rețineți că 0777 este deja modul implicit pentru directoare și poate fi schimbat în continuare de umask curent.

WordPress are, de asemenea, o funcție foarte utilă wp_mkdir_p care va crea recursiv o structură de directoare.

Sursa de referinta:-

Funcția wp_mkdir_p($țintă) ( $wrapper = nul; // dezlipește protocolul if(wp_is_stream($țintă)) ( list($wrapper, $țintă) = explode("://", $țintă, 2); ) // de la php.net/mkdir notele contribuite de utilizator $target = str_replace("//", "/", $target // pune wrapper-ul înapoi pe țintă if($wrapper !== null) ( $target). ); = $target . if (empty($target)) $target = "/"; if (fișier_există($target)) return @is_dir($target care există și moștenește asta ($target); " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Obțineți biții de permisiune. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777 ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Dacă este setată o umask care modifică $dir_perms, va trebui să re- setați corect $dir_perms cu chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1));<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

pentru ($i = 1; $i

Am nevoie de același lucru pentru site-ul de conectare. Trebuia să creez un director cu două variabile. Directorul $ este folderul principal în care am vrut să creez un alt subfolder cu numărul de licență al utilizatorilor.

Include_once("../include/session.php"); $lnum = $sesiune->lnum; //Numărul licenței utilizatorilor din sesiuni $directory = uploaded_labels; // Numele directorului în care folderul este creat dacă (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Ceva mai generic așa cum apare pe google. Deși detaliile sunt mai specifice, titlul acestei întrebări este mai generic.

/** * creează recursiv o cale de director lungă */ funcția createPath($cale) ( dacă (is_dir($cale)) returnează adevărat; $prev_path = substr($cale, 0, strrpos($cale, "/", - 2) + 1); $retur = createPath($prev_path) ($return && is_writable($prev_path)) ?

Ar putea fi îmbunătățit prin furnizarea unui nivel de oprire, astfel încât pur și simplu să eșueze dacă iese din folderul utilizatorului sau ceva de genul acesta și prin activarea permisiunilor.

Pentru a crea un folder dacă nu există deja

Luarea în considerare a problemei de mediu.

  • WordPress.
  • Server de gazduire web.
  • Presupunând că Linux nu rulează PHP.

bool mkdir(șir $pathname[, int $mode=0777[, bool $recursive=FALSE[, resursă$context]]])

Manualul afirmă că singurul parametru necesar este $pathname !

deci putem codifica pur și simplu:

Explicaţie:

Nu trebuie să trecem niciun parametru sau să verificăm dacă folderul există sau chiar parametrul modului de transfer dacă este necesar; din urmatoarele motive:

  • Comanda va crea un folder cu permisiunea 0755 (permisiunea implicită pentru un folder public) sau 0777, permisiunea implicită pentru comandă.
  • modul este ignorat în Gazdă Windows care rulează PHP .
  • Comanda mkdir are o verificare încorporată dacă folderul există; deci trebuie doar să verificăm dacă returnează True | Fals; și aceasta nu este o eroare, este doar un avertisment, iar avertismentul este dezactivat implicit pe serverele de găzduire.
  • În funcție de viteză, este mai rapid dacă avertismentul este dezactivat.

Acesta este un alt mod de a privi întrebarea și de a nu pretinde cea mai bună sau optimă soluție.

Testat pe PHP7, Production Server, Linux

De asemenea, puteți încerca:

$dirpath = "cale/spre/dir"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mod, adevărat);

Dacă (!is_dir("directorul_cale")) ( @mkdir("directorul_cale"); )

O modalitate mai rapidă de a crea un folder:

Dacă (!is_dir("cale/către/director")) ( mkdir("cale/către/director", 0777, adevărat); )

veți

Printf("Bună %s,
", $nume);

înainte de instalare cookie-uri, care este interzis. Nu puteți trimite date înainte de anteturi, nici măcar o linie goală.

PHP are o singură funcție - mkdir(), care vă permite să creați directoare pe serverul site-ului web, care uneori sunt atât de necesare în gospodărie. De exemplu, atunci când creați un material nou, trebuie să creați un folder pentru acesta, unde, folosind din nou CMS, veți încărca toate fișierele necesare.

Mkdir("/calea/la/my/dir", 0700);

Aceste. într-un anumit director creăm un folder nou și, de exemplu, setăm modul acestuia la modul 0700, de exemplu, pentru a putea scrie fișiere în folder, schimbăm modul în 0777.

Dar aici apare problema cu mkdir(). Când faci asta script php când funcția de server safe_mode este activată, proprietarul (UID) este verificat și dacă proprietarul scriptului și al folderului nu se potrivesc, atunci este posibil să nu puteți, de exemplu, să scrieți un fișier în directorul creat, să ștergeți un fișier în el sau, de exemplu, prin FTP, nu veți putea șterge folderul în sine.

Dar există o soluție mai elegantă la această problemă, fără a fi nevoie să-i ceri hosterului să dezactiveze funcția safe_mode pentru tine (această funcție este activată pe absolut toate site-urile de găzduire în mod implicit, pentru a asigura securitatea). Practic, serviciile de găzduire plătite oferă și acces la ftp, și de la care vom începe.

$conn_ftp = @ftp_connect(„serverul_ftp_dvs”, 21, 5);

Prima variabilă din funcție este adresa serverului dvs. ftp, a doua este portul pe care vă conectați la ftp și ultima este expirarea conexiunii permisă. Un pic despre timeout, este necesar pentru operațiunile de rețea ulterioare, dacă nu îl introduceți, atunci valoarea implicită este setată la 90 de secunde; După conexiune, verificăm dacă a avut succes și trimitem login-ul și parola:

Dacă($conn_ftp) // conexiunea a fost reușită ( $login_result = @ftp_login($conn_ftp, „user”, „pass”); // introduceți datele dvs. de conectare și parola pentru FTP if($login_result) // autentificarea și verificarea parolei a trecut succes(ftp_pasv($conn_ftp, TRUE);))

După verificarea login-ului și a parolei, trebuie să decidem asupra modului pasiv și să-l setăm la TRUE sau FALSE - acest lucru este necesar dacă alte funcții FTP nu vor funcționa corect. Acum, după definirea modului pasiv, ne putem crea folderele, voi descrie toate funcțiile care vă pot fi utile în viitor:

$fișier = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Se creează directorul 345 în folderul materiale, dacă folderul materiale nu există, //se va crea și el, la fel și cu folderul public_html (acest director //este indicat astfel încât să puteți vedea întreaga cale, altfel este doar un folder cu site) ftp_chdir($conn_ftp, "public_html/materials"); //Dacă aveți cu siguranță un folder de materiale, atunci nu trebuie să scrieți întreaga cale //, puteți doar să mergeți la el mai întâi și apoi să creați un folder 345 în el folosind // următorul cod ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $fișier); //Toate folderele sunt create implicit cu modul 0755, această comandă vă va permite să îl schimbați //în 0777, ceea ce vă va permite să adăugați fișiere în folderul creat.

Acum voi da un exemplu complet de cod de lucru, astfel încât să puteți vedea cum arată totul, de exemplu, al meu:

$dir_name = time(); //Aici creez numele folderului în funcție de momentul lansării scriptului $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // conexiunea a fost reușită ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // introduceți datele dvs. de conectare și parola pentru FTP if($login_result) // autentificarea și verificarea parolei a trecut succes ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod($conn_ftp, 0777, $dir_name); ) )

De asemenea, merită să spuneți puțin despre specificarea directoarelor la creare, dacă specificați o bară oblică la început, folderul va fi creat în raport cu rădăcina ftp. Când vă conectați la un server FTP, vă conectați întotdeauna la rădăcină, așa că țineți cont de acest lucru.