Autor Zpráva
Hroch92
Profil
Dobrý den,
používám tento jednoduchý script pro upload souboru na FTP server:
<?php
$soubor_name = ($_FILES["soubor"]["name"]);
$soubor = ($_FILES["soubor"]["tmp_name"]);
$ok = ($_POST["ok"]);

if ($ok == "Upload" && $soubor_name!="")
{
    if (move_uploaded_file($soubor, "upload/$soubor_name"))
        {
        chmod ("upload/$soubor_name", 0646);
        echo "<b>Soubor $soubor_name byl nahran na server</b><BR>";
        }
    else
        {
        echo "<b>Chyba - soubor nebyl nahran</b><BR>";
        }
}
?>


Když ale soubor obsahuje v názvu českou diakritiku, tak se název úplně rozsype a potom nelze se souborem dále pracovat, ani ho smazat. Za případnou pomoc předem děkuji.
Alphard
Profil
Tak se zbavte diakritiky.
Hroch92
Profil
Dostal jsem se asi k tomuhle:
<?php
$soubor_name = ($_FILES["soubor"]["name"]);
$soubor = ($_FILES["soubor"]["tmp_name"]);
$ok = ($_POST["ok"]);

function friendly_url($soubor_name) {
    $soubor_name = preg_replace('~[^\\pL0-9_]+~u', '-', $soubor_name);
    $soubor_name = trim($soubor_name, "-");
    $soubor_name = iconv("utf-8", "us-ascii//TRANSLIT", $soubor_name);
    $soubor_name = strtolower($soubor_name);
    $soubor_name = preg_replace('~[^-a-z0-9_]+~', '', $soubor_name);
    return $soubor_name;
}

if ($ok == "Upload" && $soubor_name!="")
{
    if (move_uploaded_file($soubor, "upload/$soubor_name"))
        {
        chmod ("upload/$soubor_name", 0646);
        echo "<b>Soubor $soubor_name byl nahran na server</b><BR>";
        }
    else
        {
        echo "<b>Chyba - soubor nebyl nahran</b><BR>";
        }
}
?>


Ale nefunguje to, nejspíš je to hodně špatně, ale v php jsem začátečník, takže spíš experimentuji, i když tenhle script na upload zrovna nutně potřebuji.
DarkMeni
Profil *
Musí se název po načtení na server vykreslit echem?
Někde na netu jsem viděl jak se zbavuje diakritiky, a v tomhle případě mě napadá několik možností:
- Zbavení diakritiky //
$file_name = eregi_replace("áčď...","acd...",$file_name);

- Kontrola diakritiky //
if(eregi("^[a-zA-Z0-1\.\-\_]{5,40}$",$file_name)){$continue = true;}
else{$continue = false;echo "Nějaká hláška že soubor nemůže být uploadnutý";}

- Automatické vygenerování jména //
$koncovka = strchr(".",$file_name); $jmeno = FunkceNaAutomatickeGenerovaniRetezce(); $cele_jmeno = $jmeno.$koncovka;
(To by se mohlo už uložit třeba jako "fDFDFgs114sSS.txt")
Možná že je dobrý nápad i to co jsi napsal:
    $soubor_name = preg_replace('~[^\\pL0-9_]+~u', '-', $soubor_name);
    $soubor_name = trim($soubor_name, "-");
    $soubor_name = iconv("utf-8", "us-ascii//TRANSLIT", $soubor_name);
    $soubor_name = strtolower($soubor_name);
    $soubor_name = preg_replace('~[^-a-z0-9_]+~', '', $soubor_name);

Ale nevim jak funguje preg_replace a ty ostatní funkce už neznám vůbec. Kdyžtak já po uploadování používám třetí metodu (náhodné generování jména), potom si jde do databáze ukládat informace o tom jak se ten soubor jmenoval před uploadem, jakou měl velikost atd... záleží na tom jestli chceš aby ten soubor potom šlo stáhnout s původním jménem a nebo ne.
Rellik
Profil
Já sice nepřejmenovávnám název souboru, ale něco podobného používám při vytváření složky do které se soubor uploaduje. Do databáze pak uložím původní název, který je pak použitý pro název (v tomto případě) fotogalerie. A složka se vytvoří se stejným názvem jen zbavená diakritiky a mezer. myslím že by to šlo jednoduše aplikovat i na přejmenování souborů..

strtr($slozka,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ","acdeeinorstuuyz_acdeeinorstuuyz")


při uploadu bych to viděl asi nějak takhle:
$file = $_FILES["file"]["name"];
$rename_file = strtr($file,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ","acdeeinorstuuyz_acdeeinorstuuyz");
move_uploaded_file($_FILES["file"]["tmp_name"], "./slozka/".$rename_file);
Hroch92
Profil
Díky moc všem za rady, už to konečně funguje a odstraňuje diakritiku bez problémů, script teď vypadá takhle:
<?php
$soubor_name = ($_FILES["soubor"]["name"]);
$rename_file = strtr($soubor_name,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ","acdeeinorstuuyz_acdeeinorstuuyz");
$soubor = ($_FILES["soubor"]["tmp_name"]);
$ok = ($_POST["ok"]);


if ($ok == "Upload" && $rename_file!="")
{
    if (move_uploaded_file($soubor, "upload/$rename_file"))
        {
        chmod ("upload/$rename_file", 0646);
        echo "<b>Soubor $rename_file byl nahran na server</b><BR>";
        }
    else
        {
        echo "<b>Chyba - soubor nebyl nahran</b><BR>";
        }
}
?>
Hroch92
Profil
Tak tenhle poslední script funguje jenom v Chrome. V Opeře ani v IE to nefunguje. Nevíte čím by to mohlo být?
okolojdouci
Profil *
Definuj "funguje".
Co přesně se stane? Co z toho kódu proběhne? Co už ne?
Hroch92
Profil
no v Chrome to normálně uploaduje soubor a vypíše Soubor byl nahrán na server. V ostatních to dělá, že se uploaduje soubor, ale nakonec na serveru soubor není a ani to nic nevypíše. Nevím, jak to moc líp popsat nebo vyzkoušet.
okolojdouci
Profil *
Hroch92:
Nevím, jak to moc líp popsat nebo vyzkoušet.
Jednoduše. Prolož si svůj kód hláškami
echo "1";
echo "2";

a pak sleduj, co se ti vypíše. Tím můžeš přesně lokalizovat chybu.
Hroch92
Profil
Takže chyba musí být někde tady:
if ($ok == "Upload" && $rename_file!="")
{
    if (move_uploaded_file($soubor, "upload/$rename_file"))
        {
        chmod ("upload/$rename_file", 0646);


Vše před tím proběhne bez problémů, ale echo "soubor byl nahran" už ne...
Rellik
Profil
já bych vyčistil kód.

if ($ok == "Upload" && $rename_file!="")
{
    if (move_uploaded_file($soubor, "upload/".$rename_file))
        {
        chmod ("upload/".$rename_file, 0646);


Na některých servrech to jinak nefunguje... Což je možná tvůj případ...

I když něco vypisuješ pomocí echa tak určitě ukončíš uvozovky před proměnnou ne?
příklad:
$text = "Ahoj";
echo "Volám na tebe ".$text;

// a ne

echo "Volám na tebe $text";


To druhé echo by ti možná vypsalo přímo to co je v uvozovkách a nedosadilo proměnnou...
Hroch92
Profil
<?php
$soubor_name = ($_FILES["soubor"]["name"]);
echo "1";
$rename_file = strtr($soubor_name,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ","acdeeinorstuuyz_acdeeinorstuuyz");
echo "2";
$soubor = ($_FILES["soubor"]["tmp_name"]);
echo "3";
$ok = ($_POST["ok"]);
echo "4";


if ($ok == "Upload" && $rename_file!="")
{
    if (move_uploaded_file($soubor, "upload/".$rename_file))
        {
        chmod ("upload/".$rename_file, 0646);
        echo "<b>Soubor ".$rename_file," byl nahran na server</b><BR>";
        }
    else
        {
        echo "<b>Chyba - soubor nebyl nahran</b><BR>";
        }
}
?>


Tak pořád nic...Opera vypíše 1234, ale dál už nic.
Tori
Profil
Rellik:
Na některých servrech to jinak nefunguje
Na kterých? Docela by mne to zajímalo, ještě jsem se nesetkala s tím, že by byl nějaký rozdíl v použití proměnné uvnitř nebo mimo řetězce.

Hroch92:
Proměnné $ok a $rename_file mají očekávanou hodnotu? Dostane se skript za podmínku na ř.12? (přidejte mezi ř.13 a 14 další echo)
okolojdouci
Profil *
Hroch92:
Opera vypíše 1234, ale dál už nic.

A co z toho vyplývá? Vůbec nic. Nepochopils. Echa dej tam, kde z toho, jestli se provedou, můžeš něco vydedukovat.
Když dáš to první echo pod ř. 13, zjistíš, jestli podmínka z ř. 12 byla splněna. Atd.
Hroch92
Profil
Omlouvám se za nepochopení, ale php vážně v podstatě neumím, setkám se s ním, jen když potřebuji něco konkrétního jednoduchého udělat...

Ale měli jste pravdu, když dám echo pod ř.13, tak už ho opera nevypíše.
Tori
Profil
Hroch92:
Proč tam vlastně máte to
if ($ok == "Upload")
? Na rozlišení, jestli se zpracovává odeslaný formulář+soubor by mělo stačit
if ($rename_file)
, ne?
Totiž ptám se kvůli tomu, že MSIE neodesílá hodnotu <submit>u, pokud formulář obsahuje jen jedno textové pole, takže Opera by třeba mohla dělat totéž.
Hroch92
Profil
Tori: nejhorší je, že já sám nevím, proč to tam bylo, ten kód jsem převzal z nějakého návodu, každopádně vaše rada pomohla, už to funguje i v Opeře a IE :-) Ještě jednou díky moc všem, co mi poradili.
Jen pro ukázku, snad už konečně plně funkční kód:
<?php
$soubor_name = ($_FILES["soubor"]["name"]);
$rename_file = strtr($soubor_name,"áčďéěíňóřšťúůýž ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ","acdeeinorstuuyz_acdeeinorstuuyz");
$soubor = ($_FILES["soubor"]["tmp_name"]);
$ok = ($_POST["ok"]);

if ($rename_file!="")
{
    if (move_uploaded_file($soubor, "upload/".$rename_file))
        {
        chmod ("upload/".$rename_file, 0646);
        echo "<b>Soubor ".$rename_file," byl nahran na server</b><BR>";
        }
    else
        {
        echo "<b>Chyba - soubor nebyl nahran</b><BR>";
        }
}
?>
Alphard
Profil
Celé je to tak trochu patlanina. Zajímalo by mě, kde se bere ten zvyk kopírovat superglobální proměnné ($ok = ($_POST["ok"]);).

Pro zjištění, jestli proběhl upload, exituje funkce is_uploaded_file().
Pokud jde o zbavení se diakritiky, můj návrh byl lepší (white list proti black list), jen by se ta funkce musela použít a ošetřit tečku před extenzí.
Rellik
Profil
Tori:
„Na některých servrech to jinak nefunguje“
Na kterých? Docela by mne to zajímalo, ještě jsem se nesetkala s tím, že by byl nějaký rozdíl v použití proměnné uvnitř nebo mimo řetězce.
To už nevím na kterých to bylo, ale prostě to fungovalo až když se to dal mimo závorky. Možná to bylo ještě na starém phpčku. Od té doby to píšu mimo, takže je možné že už to je jedno....
Alphard_
Profil *
Rellik:
Nevím, s jak starými verzemi jste se setkal, ale já takovou nepamatuji.
Možná si to pletete s:
echo 'V apostrofech nema $promenna zvlaštní význam.';
Rellik
Profil
Alphard:
Možná si to pletete s:
jo je to možné, když nad tím tak přemýšlím... Nicméně já osobně to píšu mimo uvozovky... Aspoň vím že to bude pokaždé fungovat... :-)

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