Autor Zpráva
Radim24
Profil
Zdravím
mám jen dotaz k tomuto návodu:

http://php.vrana.cz/ukladani-souboru-od-uzivatele.php?new=8647#new

je třeba na serveru nastavit cestu k adresáři s dočasnými soubory? Dostávám hlášku, přenos se nezdařil. Asi bude špatná cesta k souboru s adresářem, ne? Dá se toto nastavit třeba pomocí nějaké direktivy v .htaccess?

Dík
Jan Tvrdík
Profil
Radim24:
je třeba na serveru nastavit cestu k adresáři s dočasnými soubory
Ne, není.

Dostávám hlášku, přenos se nezdařil
Pošli sem celé znění chybové hlášky.
Radim24
Profil
Vkládám sem výstup i s debugem:

print_r($_POST);
<P>Array
(
[MAX_FILE_SIZE] => 2000000
[recipient] => webhope@centrum.cz
[env_report] => REMOTE_HOST,HTTP_USER_AGENT
[phone_no] =>
[email] =>
[Dotaz_na_nás] =>
[Submit] => Odeslat
)
<P>print_r($_FILES);
<P>Array
(
[document] => Array
(
[name] => +třídy.doc
[type] => application/msword
[tmp_name] => /tmp/phpQn7PrF
[error] => 0
[size] => 178688
)

)
<P><b>Nepodařilo se přesunout uploadovaný soubor.
/<b>
?>
Radim24
Profil
$koncovky = array('jpg', 'jpeg', 'png', 'gif', 'doc');
$image_transfer = false; // nejde o přesun obrazu, nemusím kontorlovat velikost obrazu

$chyba = "";


if (!$_FILES || $_FILES["document"]["error"] == UPLOAD_ERR_INI_SIZE) {
    $chyba = "Soubor je příliš velký, maximální velikost je " . ini_get('upload_max_filesize') . ".\n";
} elseif ($_FILES["document"]["error"] == UPLOAD_ERR_NO_FILE) {
    $chyba = "Nevybrali jste soubor, který chcete nahrát.\n";
} elseif ($_FILES["document"]["error"]) {
    $chyba = "Soubor se nepodařilo nahrát, kontaktujte prosím správce serveru.\n";
} elseif (!in_array(strtolower(pathinfo($_FILES["document"]["name"], PATHINFO_EXTENSION)), $koncovky)) {
    $chyba = "Koncovka souboru musí být jedna z: " . implode(", ", $koncovky) . ".\n";
} elseif ($image_transfer && !($imagesize = getimagesize($_FILES["document"]["tmp_name"])) || $imagesize[2] > 3) {
    $chyba = "Typ obrázku musí být JPG, PNG nebo GIF.\n";
} elseif (!@move_uploaded_file($_FILES["document"]["tmp_name"], "/" . $_FILES["document"]["name"])) {
  $chyba="Nepodařilo se přesunout uploadovaný soubor.\n";
}
echo "<b>".$chyba."/<b>";
Jan Tvrdík
Profil
Radim24:
Odstraň ten zavináč před voláním move_uploaded_file, ať se dozvíš, kde je problém.
EDIT: Už ten problém pravděpodobně vidím. Pokoušíš se zapsat do rootu (/), na což téměř určitě nemáš práva. Změň to na "./" a nastav práva pro zápis do aktuální složky.
Radim24
Profil
Už to funguje, díky moc :-)
Radim24
Profil
Ještě jeden problém mi nastal.

Ve formuláři nastavuju nějakou hodnotu MAX_FILE_SIZE - zkoušel jsem od několika kilobyte až do 8 megabyte.

<input type="hidden" name="MAX_FILE_SIZE" value="8388608">

a v PHP vracím

die( ini_get('upload_max_filesize')."" );

výsledek je ale vždy stejný:

Soubor je příliš velký, maximální velikost je 2M.

Jak to že mi to píše takový nesmysl, když jsem nastavil "MAX_FILE_SIZE" jinak?

Hodnota v PHP je:
; Maximum size of POST data that PHP will accept.
post_max_size = 8M
Jan Tvrdík
Profil
Radim24:
Nastav v php.ini ještě upload_max_filesize.
fopen
Profil *
mne sa podari si myslim celkom zaujimavo vyriesit problem z upload_max_filesize
$UploadMaxFilesize = (integer)ini_get('upload_max_filesize')*1048576;
Radim24
Profil
Jan Tvrdík
Aha tak tuhle directivu jsem přehlédl, díky

fopen
Na to? Stačí tam přidat písmeno B, že je to v Megabytech.

Spíše jde o to, že nevím velikost toho přeneseného souboru, abych ji zobrazil uživateli. Je tam $HTTP_POST_FILES['userfile']['size'] - to ale vrací "0".
Radim24
Profil
Jan Tvrdík
Ptal jsem se na to zda je to odesílání dat přes formulář zneužitelné a prý lehce. Jsem si totiž uvědomil, že hackerovi stačí vytvořit jakýkolik svůj vlastní formulář a může jich vytvořit kolik chce, aby zahltil server nesmyslnými daty... Případné ošetřování či kontorla proti robotům se děje až po příjmutí dat.
fopen
Profil *
Radim24
$UploadMaxFilesize pouzivam prave na overovanie velkosti uploadovaneho suboru a jeho hodnotu ziskavam takto z aktualnej kofiguracie php:
if($_FILES['userfile']['size'] < $UploadMaxFilesize){
// upload suboru
}else{
	echo'File too large '.$_FILES['userfile']['size'].' bytes. Maximum is '.$UploadMaxFilesize;
}
Jan Tvrdík
Profil
fopen:
To by mě zajímalo, jak $_FILES['userfile']['size'] může překročit (int) ini_get('upload_max_filesize')*1048576. Podle mě se do té druhé větve nelze nikdy dostat.
Jednodušší je kontrolovat hodnotu $_FILES['userfile']['error'] (viz dokumentace).
fopen
Profil *
Jan Tvrdík
u mna je to dalsia podmienka:
if(@is_uploaded_file($_FILES['userfile']['tmp_name'])){
// upload suboru
}else{
	echo'Upload error: '.$_FILES['userfile']['error'];
}
Alphard
Profil
Radim24:
Jsem si totiž uvědomil, že hackerovi stačí vytvořit jakýkolik svůj vlastní formulář a může jich vytvořit kolik chce, aby zahltil server nesmyslnými daty
No nevím, jestli bude mít náladu tohle dělat :-) Ošetřete si, aby nebylo možné nahrát a spustit nějaký škodlivý kód, zbytek nechte až když bude problém.
Tilfio
Profil *
Zdravim,
s php teprve zacinam a mam otazku.
Nahravat soubory do slozky na server a pak je zobrazit na svych strankach treba v galerii jde i bez databazi?
Pokud ano tak k tomu mam potrebne skripty jenze nechapu nastavovani cesty v souboru php.ini, myslel jsem ze v nem se to nastavuje pouze kdyz mi jede php na mem PC na localhost. Kde ale nastavim cestu prozatimnimu souboru a cestu kam se ma ulozit nahrany soubor kdyz vse rovnou nahravam na webzdarma?
Dekuji za odpoved
Tilfio
Profil *
Nasel jsem asi jeden z tech spise zakladnejsich skriptu a funguje mi jen se mi soubor nahrava primo do korenoveho adresare serveru. Co do nej musim dopsat a kam abych si mohl urcit cestu do podslozky na pr.: /obr/



<?php
if (isset($akce))

{

if (move_uploaded_file($soubor, $soubor_name))

{echo "Soubor ".$soubor_name." o velikosti ".$soubor_size." bajtů byl úspěšně uploadnut na server<BR>";}

else {echo "Při nahrávání souboru ".$soubor_name." o velikosti ".$soubor_size." bitů došlo k chybě!<BR>";}


} ?>



Pak jsem si nasel kod kterym si vypisu vsechny obrazky ze slozky coz by mi stacilo.
Tilfio
Profil *
<?php
if (isset($akce))

{

if (move_uploaded_file($soubor, $soubor_name))

{echo "Soubor ".$soubor_name." o velikosti ".$soubor_size." bajtů byl úspěšně uploadnut na server<BR>";}

else {echo "Při nahrávání souboru ".$soubor_name." o velikosti ".$soubor_size." bitů došlo k chybě!<BR>";}


} ?>
Tilfio
Profil *

Nasel jsem asi jeden z tech spise zakladnejsich skriptu a funguje mi jen se mi soubor nahrava primo do korenoveho adresare

<?php
if (isset($akce))

{

if (move_uploaded_file($soubor, $soubor_name))

{echo "Soubor ".$soubor_name." o velikosti ".$soubor_size." bajtů byl úspěšně uploadnut na server<BR>";}

else {echo "Při nahrávání souboru ".$soubor_name." o velikosti ".$soubor_size." bitů došlo k chybě!<BR>";}


} ?>
Radim24
Profil
Ještě dotaz.

Teď chci udělat formulář, kde bude moci uživatel odeslat více souborů najednou. Kladu si otázku. Max_file_size se vztahuje ke každému jednomu souboru nebo ke všem dohromady?

Server na kterém jedu má nastaveno:
post_max_size 64M

Je to dost vysoká hodnota, ale kdyby měl nastaveno např. 8M

A já bych odesílal např. 10 fotek po 1.2 MB (extrémní příklad),
odeslalo by se to nebo ne?
Radim24
Profil
Tak takhle jsem to vyřešil:

$post_max_size=64;
$upload_max_size=2;
$file_max_count = $post_max_size/$upload_max_size;

echo "Maximum souborů, které můžete odeslat je $file_max_count.";
Tilfio
Profil *
Mam problem:
Vytvoril jsem tuhle databázy:
ALTER TABLE `fotky` CHANGE `id` `id` INT( 99 ) UNSIGNED DEFAULT '1',
CHANGE `nazev` `nazev` VARCHAR( 250 ) CHARACTER SET latin2 COLLATE latin2_czech_cs DEFAULT 'fotka'

kod je skopirovany az po upravach databaze proto tam neni create a pod. Je to skopirovane z weboveho rozhrani kde jsem ji vytvarel.
Pak mam tento skript na ulozeni soubrou (fotky) + skript na nacteni fotek ze slozky:
<?php
if ($handle = opendir('./fotky/')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo "<a href=\"./fotky/".$file."\"><img src=\"./fotky/".$file."\" alt=\"./fotky/".$file."\" width=\"100\" hight=\"100\" padding=\"5px\"></a></ br>";
        }
    }
    closedir($handle);
}
?>
&nbsp;<BR>



<?


$db="nazev";
$spojeni = mysql_connect("mysql.webzdarma.cz","pokusphpecko","heslo");
mysql_select_db($db, $spojeni);

$nazev= mysql_query("SELECT id,nazev FROM fotky ORDER BY id DESC"); //SQL příkaz

$cislo = mysql_fetch_array($nazev);



++$cislo['id'];

$cesta = "".$cislo['id'].".jpg";



$soubor = ($_FILES["soubor"]["tmp_name"]);
$ok = ($_POST["ok"]);

if ($ok == "Upload" && $cesta!="")
{
    if (move_uploaded_file($soubor, "./fotky/$cesta"))
        {
        chmod ("./fotky/$cesta", 0646);
        echo "<br />";
        echo "Fotka <u>$cesta</u> byla úspěšně <br /> nahrána na server";
        $nazev= mysql_query("INSERT INTO 'fotky' (id,nazev) VALUES ('', $cesta)"); //SQL příkaz
        }
    else
        {
        echo "<b>Fotku se nepodařilo nahrát na server.</b><BR>";
        }
}

?>



Problem je ze po nahrání fotky se mi zobrazi chyba:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /3w/wz.cz/p/pokusphpecko/galerie_fotky.php on line 45
coz je radek :
 $cislo = mysql_fetch_array($nazev);

Fotka se nahraje ale neulozi se do slozky ./fotky/ a tim padem se nenacte.
Pokud fotku nahraju rucne pres FTP tak se fotka zobrazi.
Pokud by mi s tim nekdo pomohl byl bych moc rad.
AM_
Profil
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
viz FAQ
Radim24
Profil
Ta hláška pravděpodobně znamená, že není žádný výsledek, který by bylo možné zpracovávat. Musíš zkontrolovat mysql výstup v předchozím mysql příkazu. Můžeš k tomu snadno použít phpmyadmin a příkaz select.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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