Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

PHP fopen na Windowsu, ćirilični naziv datoteke i imena tipa УНИВЕ

PHP
  • 3 odgovora
  • 3.082 pregleda

Najnovija ↓

PHP fopen na Windowsu, ćirilični naziv datoteke i imena tipa УНИВЕ 17.07.2010. u 23:39 · pre 198 meseci
izmenjeno 1 put, poslednji put Goran Rakić 06.08.2010. u 03:36
  1. Goran Rakić06.08.2010. u 03:36zapis iz teksta poruke
#1
aplikacija je radjena uz pomoc codeigniter-a i sa cirilicom sve lepo radi na sajtu, upis, ispis iz baze sve ok, ali svaki fajl koji se upload-uje dobije naziv tipa УНИВЕРЗИТЕТ У П, dok se u bazi ispishe normalan naziv

koristim WAMP
Re: pri uploadu fajlovi na serveru imaju imena tipa УНИВЕРЗИТЕТ У П 05.08.2010. u 19:27 · pre 197 meseci #2
Moj predlog; neka tvoja klasa za baratanje slikama (npr Image) bude ta koja ce odrediti ime fajla. Ja koristim file-34234424.ekstenzija, gde su brojevi unix time stamp, a ektenziju kod sam odredjuje.

Pre snimanja fajla, proveri se da li mozda vec postoji fajl sa istim imenom, pa ako postoji, doda -1 u ime, tj. file-34234424-1.jpg, file-34234424-2.jpg itd.
Code:

        public function createNewFilename($filename = false)
        {
            $id3Results = $this->getId3Results() ;
            $extension = $id3Results['fileformat'] ;
            
            if ( $filename ) {
                $num = 0 ;  
            } else {
                $filename = 'file' ;
                $num = time() ;
            } 
            
            while(file_exists( $this->getDirectoryPath() . '/' . ( $newName = $filename . ($num==0 ? '' : '-' . $num). '.' . $extension ))){
                $num ++ ;
            }
            return $newName ;
        }


Gornji kod ti omogucava da mozes i sam da odredis ime fajla; samo pozovies createNewFilename('slika') pa ce se fajl snimiti kao npr. 'slika.jpg, slika.png, slika-1.png' itd...
Re: pri uploadu fajlovi na serveru imaju imena tipa УНИВЕРЗИТЕТ У П 06.08.2010. u 03:35 · pre 197 meseci #3
Problem koji verovatno muči autora jeste da pokušava da sačuva datoteku sa nazivom u UTF-8 kodnoj strani dok operativni sistem očekuje drugu kodnu stranu. Postoji i prijavljeni bug: http://bugs.php.net/bug.php?id=46990

Gornji kod ne rešava problem da između provere i premeštanja datoteke, druga paralelno pokrenuta skripta može da upiše datoteku sa istim imenom čime dolazi do sukoba.

Ako se već ne koristi funkcija koja istovremeno može da proveri i napravi datoteku ako ne postoji samim tim rezervišući ime, a vraćajući grešku ako ime već postoji za pokušaj sa drugim imenom onda barem treba maksimalno suziti prostor između file_exists() provere i move_uploaded_file() ili šta se već kasnije u kodu koristi za premeštanje datoteke.

Takva funkcija u PHP-u je fopen() sa "x+" zastavicom što se ponaša kao open(..., O_EXCL|O_CREAT) iz POSIX-a.

Ako se nazivi čuvaju u bazi i ime ili deo imena datoteke je primarni ključ onda treba prvo u bazi započeti transakciju, napraviti unos, premestiti datoteku i na kraju ako nema grešaka prihvatiti transakciju.

Ovo je greška koju programeri često prave.

Treba biti oprezan pri čitanju naziva od korisnika, bilo u celosti ili samo jednom delu kako na taj način ne bi omogućili sigurnosni propust da korisnik pošalje novi ../index.php. Funkcija basename() je za to korisna.
Potpis
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
Re: PHP fopen na Windowsu, ćirilični naziv datoteke i imena tipa УНИВЕ 06.08.2010. u 13:13 · pre 197 meseci #4
Citat:
Goran Rakić: Problem koji verovatno muči autora jeste da pokušava da sačuva datoteku sa nazivom u UTF-8 kodnoj strani dok operativni sistem očekuje drugu kodnu stranu. Postoji i prijavljeni bug: http://bugs.php.net/bug.php?id=46990

Gornji kod ne rešava problem da između provere i premeštanja datoteke, druga paralelno pokrenuta skripta može da upiše datoteku sa istim imenom čime dolazi do sukoba.

Da, ovoga sam svestan i nisam imao neku bolju ideju da to resim osim da kolonu 'filename' u tabeli 'image' stavim kao unique (sto u sustini i jeste). Snimanje fajla se nalazi u postSave() metodi Doctrine-a, a kako doctrine koristi transakcije, ne moze doci do ove situacije sa prepisivanjem. Tj. kad doctrine krene da snima u 'image' tabelu, ostali procesi su blokirani ako pokusavaju isto. Ako se ipak desi takav slucaj, doctrine baca exception i opet nema prepisivanja.

Note:
moj program zapravo proverava 'filename' kolonu iz tabele, a ne ime fizickog fajla. Ovo je primer starog koda da bi amitkic razumeo poentu. Kod ce ipak morati sam da napise.
Citat:

Ako se nazivi čuvaju u bazi i ime ili deo imena datoteke je primarni ključ onda treba prvo u bazi započeti transakciju, napraviti unos, premestiti datoteku i na kraju ako nema grešaka prihvatiti transakciju.

Ovo je greška koju programeri često prave.

Treba biti oprezan pri čitanju naziva od korisnika, bilo u celosti ili samo jednom delu kako na taj način ne bi omogućili sigurnosni propust da korisnik pošalje novi ../index.php. Funkcija basename() je za to korisna.


Slazem se. Zato mislim da i treba da napravi nesto poput generisanja imena fajla. Filename parametar bi mogla biti 'slug' kolona albuma, korisnika, proizvoda.... kome slika pripada, pa bi onda imena slika bila tipa 'vanish.jpg, vanish-1.jpg, vanish-2.jpg, unistena-kosulja.jpg' itd sto google mnogo voli. Tako mi bar kazu ljudi :)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme