21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
Cipísek
Profil *
Dobrý den,
mám script na upload fotek.
Script jako takový funguje.
Před odeslání fotky, napíšu do jaké složky se má obrázek uložit.
Název složky obsahuje dikratitiku, vím že by neměla být diakritika obsažena, ale bohužel musí být.
Ovšem vytváří mi to potom paskvily v názvu složky, tak i v názvu obrázku, lze to nějak upravit?
script:
 $adresar = mysql_real_escape_string($_POST["adresar"]);
if(isset($_FILES['files'])){
    $errors= array();
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
        $file_name = $_FILES['files']['name'][$key];
        $file_size =$_FILES['files']['size'][$key];
        $file_tmp =$_FILES['files']['tmp_name'][$key];
        $file_type=$_FILES['files']['type'][$key];    
        if($file_size > 2090007152){
            $errors[]='File size must be less than 2 MB';
        }        
        $desired_dir="album/$adresar";
        if(empty($errors)==true){
            if(is_dir($desired_dir)==false){
                mkdir("$desired_dir", 0700);        // Create directory if it does not exist
            }
            if(is_dir("$desired_dir/".$file_name)==false){
                move_uploaded_file($file_tmp,"$desired_dir/".$file_name);
            }else{                                    // rename the file if another one exist
                $new_dir="$desired_dir/".$file_name.time();
                 rename($file_tmp,$new_dir) ;                
            }
         mysql_query($query);            
        }else{
                print_r($errors);
        }
    }
    if(empty($error)){
        echo "Success";
    }
}
Alphard
Profil
Tyto problémy jsou způsobeny kolizemi v různém kódování použitém v různých částech procesu zpracování. Jediné řešení je tato kódování sjednotit na jedno vybrané. Nejjednodušší cesta bude zjistit, jaké kódování používá váš server a názvy souborů do tohoto kódování na vstupu převádět (funkce iconv()) a z něj převádět na výstupu.
Problém je, když server nepodporuje kódování, které potřebujete. Sice by to možná mohlo fungovat i tak (pro os je název jen nějaká znaková sekvence, jde o její interpretaci, ale nesmíte se dostat mimo povolené znaky), ale s tím nemám zkušenosti.

Název složky obsahuje dikratitiku, vím že by neměla být diakritika obsažena, ale bohužel musí být.
V serverové struktuře, kterou nikdo nevidí (pokud nepoužíváte třeba Apache dir výpisy pro vypsání souborů), téměř jistě nemusí. Můžete si vytvořit mapy, kde každému souboru určíte název, jak se má navenek zobrazovat.
Cipísek
Profil *
Alphard:
Děkuji, zkusím se s tím poprat. Diakritika musí být bohužel zachována.
Keeehi
Profil
Cipísek:
Diakritika musí být bohužel zachována.
Jestli je to možné říci, tak by mě zajímal důvod. Jediné, co mě tak napadá je závislost na jiném software nebo zpětná kompatibilita.
Cipísek
Profil *
Keeehi:
Jde o to že se obrázek, načítá podle názvu, který obsahuje diakritiku.
Jiná možnost načítání než podle názvu není. Jde řádově o tísíce obrázků.
A číslovat je podle ID pod kterým je uložen název v databázi opravdu nehodlám. Nedokážu si představit to dělat vše ručně.
Např. 78 695 obrázků očíslovávat. UFF
Keeehi
Profil
Cipísek:
No já osobně mám rád pojmenování na základě hashe obsahu souboru. Ale to je detail. Jde o to, že žádná práce navíc to přece není. Všechno za tebe udělá script při ukládání souboru. A pokud už máš 78000 obrázků nahraných, tak se dá napsat script, který je dodatečně přejmenuje. Dělat to ručně je samozřejmě hloupost.

Ten upload je nebezpečný. Umožňuje nahrávat i jiné věci než jen obrázky.
Cipísek
Profil *
Keeehi:
Asi by to šlo nějak při uploadu porovnávat s databází, popřípadě po uploadu porovnat s databázi a pak přejmenovat( vůbec si tedy nedokažu predstavit ale jak).

Při uploadu, si myslím že to mohu hned vyloučit, protože hosting podporuje jen 20 souborů naráz, a kdyby se to mělo přejmenovávat hned tak by to bylo asi zdlouhavé.

Co se týče přejmenování po, zkusím zagooglovat jestli najdu nějaké řešení.
Keeehi
Profil
Cipísek:
Přejmenování souboru zabere řádově milisekundy. Navíc v době, kdy se PHP spouští jsou soubory na serveru dávno uploadované.

Pojmenování na základě obsahu je navíc velmi jednoduché.
$file_name = sha1_file($_FILES['files']['tmp_name'][$key]);
$original_file_name = $_FILES['files']['name'][$key];

V $file_name máš jak se soubor jmenuje na disku a v $original_file_name máš jméno tak, jak ho nahrál uživatel. Obojí si uložíš do databáze.
Cipísek
Profil *
Keeehi:
Děkuji, zítra se s tím zkusim poprat.
Ovšem nechápu jednu věc.
Obrázky mohu znovu nahrát to je to nejmenší.

Ale co se týče databáze tu nahrát znovu nemohu.
V databázi mám řádově půl milionu řadků dat.
Co jsem pochopil, tak je to myšleno tak že uploadnu obrázek, a do databáze zapíši jeho zahashovaný název. Tzn. udělat dalši sloupec v tabulce. Jak ale zajistit aby se ten hashovaný název uložil ke správnému řadku(názvu který se také zobrazuje).
Keeehi
Profil
Rozdělíš to na 2 fáze.
1) nové soubory se nahrávají novým způsobem
Jak nahrát přejmenované obrázky už víš a zbývá jen ta databáze. Jak jsi správně uvedl, bude třeba tam přidat nový sloupec. No a insert který teď máš jen rozšíříš o ten daný sloupec. Jméno souboru pod jakým je na disku už znáš, takže to není problém. Nově nahrané soubory jsou tedy už správně. Už jen tedy zbýbá

2) převod starých souborů na nový systém
Toto je jednorázová operace. Proto script pro převod nemusí být žádné umělecké dílo. Po převodu by stejně měl být odstraněn. V pseudokódu bude vypadat nějak takto.
$radky = SELECT * FROM tabulka WHERE localfilename = ""
foreach ($radky as $radek) {
    $newfilename = sha1_file($radek[originalfilename])
    move($radek[originalfilename], $newfilename)
    SQL(UPDATE tabulka SET localfilename=$newfilename WHERE id=$radek[id])
}
Cipísek
Profil *
Keeehi:
No mám co dělat. Každopádně děkuji moc.
webguru
Profil
Ak sa môžem spítať, premenná $key čo obsahuje?
Keeehi
Profil
webguru:
Zjednodušeně se jedná o indexy jednotlivých souborů v polích.
webguru
Profil
Keeehi:
ok. dík

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0