Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

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

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

[ Pregleda: 2305 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

amitkic
student
zvechan

Član broj: 186610
Poruke: 42
82.114.85.*



Profil

icon PHP fopen na Windowsu, ćirilični naziv datoteke i imena tipa УНИВЕ17.07.2010. u 22:39 - pre 167 meseci
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


[Ovu poruku je menjao Goran Rakić dana 06.08.2010. u 03:36 GMT+1]
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: pri uploadu fajlovi na serveru imaju imena tipa УНИВЕРЗИТЕТ У П05.08.2010. u 18:27 - pre 166 meseci
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...
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: pri uploadu fajlovi na serveru imaju imena tipa УНИВЕРЗИТЕТ У П06.08.2010. u 02:35 - pre 166 meseci
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.

http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

mitke013
As Divljine
Freelancer

Član broj: 231934
Poruke: 338
178.22.216.*



+34 Profil

icon Re: PHP fopen na Windowsu, ćirilični naziv datoteke i imena tipa УНИВЕ06.08.2010. u 12:13 - pre 166 meseci
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
 
Odgovor na temu

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

[ Pregleda: 2305 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.