ugrás a tartalomhoz

Képfeltöltés IE vs Firefox

enakos · 2008. Szep. 9. (K), 09.44
Sziasztok!
Az alábbi kódot használom jelenleg képfeltöltésre, de ezzel két problémám van.
Ha valaki az űrlap minden adatát kitölti csak képet nem tölt fel, akkor nem küldi el az űrlapot az adatbázisnak.
A másik pedig, hogy csak IE tudok vele képet feltölteni. Más böngészőben nem.
Várom segítségeteket.


<?
// a kép feltöltése, és a termék felvétele
//========================================
elseif ($mit=="feltoltes") {

$hiba = 0;

if (is_uploaded_file($imgfile)) {
if ($imgfile_type=="image/pjpeg") {
$newfile = "../img/" . $imgfile_name;
if (copy($imgfile, $newfile)) {
$sql = "INSERT INTO proba2 (nev, foto, leiras) VALUES ('$nev', '$imgfile_name', '$leiras')";
mysql_query($sql);
}
else {
$hiba = 1;
}
}
else {
$hiba = 1;
}
}
else {
$hiba = 1;
}

?>
 
1

Korábbi témák

Poetro · 2008. Szep. 9. (K), 11.02
A korábbi fórum témák között bizonyosan megleled a választ:
http://www.google.com/search?sitesearch=weblabor.hu&q=weblabor.hu/forumok+kép+feltöltés

Addig is ajánlom a file feltöltés ide vonatkozó leírásának olvasgatását.
2

A teljes kód

enakos · 2008. Szep. 10. (Sze), 17.41
Így néz ki a kódom. Még mindig az a problémám, hogy kizárólag IE böngészővel tudok vele képet feltölteni és hogy kötelező vele képet feltölteni.
Aki tud légyszíves segítsen.
Köszönöm

<?
ob_start();

include("../dbconn.php");
include("../fuggvenyek.php");

header("Pragma: no-cache");
Header("Cache-control: private, no-store, no-cache, must-revalidate");  
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

if (!isset($kat1)) {
  $kat1=0;
}
if (!isset($kat2)) {
  $kat2=0;
}
if (!isset($kat3)) {
  $kat3=0;
}

if (!isset($szint)) {
  $szint=0;
}
if ($szint==1) {
  $kat2=0;
  $kat3=0;
}
if ($szint==2) {
  $kat3=0;
}

if (!isset($mit)) {
  $mit="kategoria";
}


// 1. lépés: a kategória kiválasztása
//===================================
if ($mit=="kategoria") {
  ?>
  <html>

  <head>
    <META NAME="cache-control" CONTENT="private, no-store, no-cache, must-revalidate">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
    <title>Felvétel</title>
  </head>

  <body style="font-family:tahoma">
   
    <font style="font-size:12pt;color:#990033"><b>Új felvétel - a kategória kiválasztása</b></font>
    <br><br>

    <form name="urlap" action="proba_felvetel.php" method="POST">
     
      <input type="hidden" name="mit" value="kategoria">
      <input type="hidden" name="szint" value="0">

      <b>1.szint:</b>
      <select name="kat1" size="1" onChange="document.urlap.szint.value=1; document.urlap.submit()">
        <option value="0" <? if ($kat1==0) {print "selected";} ?>>válaszd ki a fő kategóriát</option>
        <?
       
        $kategoria = "";

        $sql = "SELECT * FROM kategoriak WHERE szulo1=0 ORDER BY id";
        $eredmeny = mysql_query($sql);
        while ($sor = mysql_fetch_array($eredmeny)) {
          $id = $sor["id"];
          $nev = $sor["nev"];
          ?>
          <option value="<?= $id?>" <? if ($kat1==$id) {print "selected"; $kategoria=$nev;} ?>><?= $nev?></option>
          <?
        }
        ?>
      </select>
      <br>
      <?
      if ($kat1>0) {
        $sql = "SELECT * FROM kategoriak WHERE szulo1=$kat1 AND szulo2=0 ORDER BY id";
        $eredmeny = mysql_query($sql);
        if (mysql_num_rows($eredmeny)>0) {
          ?>
          <b>2.szint:</b>
          <select name="kat2" size="1" onChange="document.urlap.szint.value=2; document.urlap.submit()">
            <option value="0" <? if ($kat2==0) {print "selected";} ?>>válassz kategóriát</option>
            <?
            while ($sor = mysql_fetch_array($eredmeny)) {
              $id = $sor["id"];
              $nev = $sor["nev"];
              ?>
              <option value="<?= $id?>" <? if ($kat2==$id) {print "selected"; $kategoria.=" - ".$nev;} ?>><?= $nev?></option>
              <?
            }
            ?>
          </select>
          <?
        }
      }
      ?>
      <br>
      <?
      if ($kat2>0) {
        $sql = "SELECT * FROM kategoriak WHERE szulo1=$kat1 AND szulo2=$kat2 ORDER BY id";
        $eredmeny = mysql_query($sql);
        if (mysql_num_rows($eredmeny)>0) {
          ?>
          <b>3.szint:</b>
          <select name="kat3" size="1" onChange="document.urlap.submit()">
            <option value="0" <? if ($kat3==0) {print "selected";} ?>>válassz kategóriát</option>
            <?
            while ($sor = mysql_fetch_array($eredmeny)) {
              $id = $sor["id"];
              $nev = $sor["nev"];
              ?>
              <option value="<?= $id?>" <? if ($kat3==$id) {print "selected"; $kategoria.=" - ".$nev;} ?>><?= $nev?></option>
              <?
            }
            ?>
          </select>
          <?
        }
      }

      ?>
      <br><br>
      <input type="hidden" name="kategoria" value="<?= $kategoria?>">
      <input type="button" value="a termék adatai -->" onClick="document.urlap.mit.value='adatok';document.urlap.submit()">

    </form>


  </body>

  </html>

  <?
}

// 2. lépés: a termék adatai
//==========================
elseif ($mit=="adatok") {

  if (!isset($nev)) {
    $nev="";
  }
  if (!isset($nev2)) {
    $nev2="";
  }
  if (!isset($rovidnev)) {
    $rovidnev="";
  }
  if (!isset($ar_huf)) {
    $ar_huf="0";
  }
  if (!isset($raktaron)) {
    $raktaron="0";
  }
  if (!isset($egyseg)) {
    $egyseg="darab";
  }
  if (!isset($leiras)) {
    $leiras="";
  }
  if (!isset($hosszu_leiras)) {
    $hosszu_leiras="";
  }
  ?>


<html>

  <head>
    <META NAME="cache-control" CONTENT="private, no-store, no-cache, must-revalidate">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
    <title>Felvétel</title>
  </head>

  <body style="font-family:tahoma;font-size:10pt">
   
    <font style="font-size:12pt;color:#990033"><b>Új felvétel</b></font>
    <br><br>

    <form name="urlap" action="proba_felvetel.php" method="POST" enctype="multipart/form-data">
     
      <input type="hidden" name="MAX_FILE_SIZE" value="512000">
     
      <input type="hidden" name="mit" value="feltoltes">
      <input type="hidden" name="kat1" value="<?= $kat1?>">
      <input type="hidden" name="kat2" value="<?= $kat2?>">
      <input type="hidden" name="kat3" value="<?= $kat3?>">
      <input type="hidden" name="kategoria" value="<?= $kategoria?>">

      <table cellpadding="5" style="font-family:tahoma;font-size:10pt">
        <tr>
          <td align="right">Kategória:</td>
          <td><?= $kategoria?></td>
        </tr>
        <tr>
          <td align="right"><b>Név:</b></td>
          <td><input name="nev" style="width:200px" value="<?= $nev?>"></td>
        </tr>
        <tr>
          <td align="right"><b>Fotó:</b></td>
          <td><input type="file" name="imgfile" style="width:350px"></td>
        </tr>
        <tr>
          <td align="right" valign="top"><b>Rövid leírás:</b></td>
          <td><textarea name="leiras" style="width:300px" rows="3"><?= $leiras?></textarea></td>
        </tr>
      </table>

      <br><br>
      <input type="button" value="feltöltés -->" onClick="document.urlap.submit()">

    </form>


  </body>

  </html>
  <?
}

// a kép feltöltése, és az űrlap felvétele
//========================================
elseif ($mit=="feltoltes") {

  $hiba = 0;

  if (is_uploaded_file($imgfile)) {
    if ($imgfile_type=="image/pjpeg") {
      $newfile = "../img/" . $imgfile_name;
      if (copy($imgfile, $newfile)) {
        $sql = "INSERT INTO proba1 (nev, foto, leiras) VALUES ('$nev', '$imgfile_name', '$leiras')";
        mysql_query($sql);
      }
      else {
        $hiba = 1;
      }
    }
    else {
      $hiba = 1;
    }
  }
  else {
    $hiba = 1;
  }

  ?>
  <html>

  <head>
    <META NAME="cache-control" CONTENT="private, no-store, no-cache, must-revalidate">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
    <title>Felvétel</title>
  </head>

  <body style="font-family:tahoma;font-size:10pt">
   
    <?
    if ($hiba==0) {
      ?>
      <font style="font-size:12pt;color:#006666"><b>Sikeres felvétel!</b></font>
     
      <?
    }
    else {
      ?>
      <font style="font-size:12pt;color:#CC0033"><b>A kép feltöltése nem sikerült!</b></font>
      <br><br>
   
      <?
    }
    ?>

  </body>

  </html>
  <?

}


mysql_close($kapcsolat);
ob_end_flush();
?>
3

Nem sikerült elolvasni?

Poetro · 2008. Szep. 10. (Sze), 18.03
Úgy látom nem sikerült elolvasni az általam elített cikket a PHP.net-en, pedig még magyarul is van. Hol keletkezik nálad az $imgfile és az $imgfile_type és $imgfile_name változók, mert nem találtam meg őket a sehol a felhasználásuk előtt.
4

változók

enakos · 2008. Szep. 10. (Sze), 18.19
Az imgfile az űrlapnál van, ahol a képet csatoljuk.
A $imgfile_type és $imgfile_name ott keletkezik.

Még egy hibát vettem észre. Másik képet ugyan azzal a névvel már nem tudok feltölteni és az új bejegyzésnél egy régebben feltöltött kép jelenik meg. Ezért jó lenne, ha minden új feltöltött kép előtt még egy egyedi azonosító is lenne.
5

register_globals OFF

Poetro · 2008. Szep. 10. (Sze), 19.47
Felejtsük már el a register_globals-t és használd a $_FILES tömböt, a move_uploaded_filet, is_uploaded_file-t ahogy a Fájlfeltöltés kezelése oldalon írják
6

ha tudnám

enakos · 2008. Szep. 10. (Sze), 21.47
Ha tudnám használni használnám én nagyon szívesen.
Átolvastam a Fájlfeltöltés kezelése oldalt, de nem lettem sokkal okosabb, hogy én mit hogy változtassak meg a kódban ahhoz hogy jó legyen...
7

$_FILES tömb

enakos · 2008. Szep. 11. (Cs), 10.19
A $_FILES tömb használatával átírtam az előző kód képfeltöltés részét.
Lehet hogy ha meglátjátok, majd a hajatokat tépitek, mert nem tudom mennyire szabályos.

Nekem így most működik úgy, mint az előző kód is. A hibák viszont ugyan úgy megvannak és ugyan azok.
- Csak IE tudok feltölteni
- kötelező képet csatolni
- azonos nevű új kép felülírja a régi azonos nevű képet a tárhelyen

<form name="urlap" action="felvetel.php" method="POST" enctype="multipart/form-data">
     
      <input type="hidden" name="MAX_FILE_SIZE" value="512000">
     
      <input type="hidden" name="mit" value="feltoltes">
      <input type="hidden" name="kat1" value="<?= $kat1?>">
      <input type="hidden" name="kat2" value="<?= $kat2?>">
      <input type="hidden" name="kat3" value="<?= $kat3?>">
      <input type="hidden" name="kategoria" value="<?= $kategoria?>">


      <table cellpadding="5" style="font-family:tahoma;font-size:10pt">
        <tr>
          <td align="right">Kategória:</td>
          <td><?= $kategoria?></td>
        </tr>
        <tr>
          <td align="right"><b>Név:</b></td>
          <td><input name="nev" style="width:200px" value="<?= $nev?>"></td>
        </tr>
 
        <tr>
          <td align="right"><b>Fotó:</b></td>
          <td><input type="file" name="userfile" style="width:350px"></td>
        </tr>
 
        <tr>
          <td align="right" valign="top"><b>Leírás:</b></td>
          <td><textarea name="leiras" style="width:300px" rows="3"><?= $leiras?></textarea></td>
        </tr>
 
      <input type="button" value="az új termék feltöltése -->" onClick="document.urlap.submit()">

    </form>

// a kép feltöltése, és a termék felvétele
//========================================
elseif ($mit=="feltoltes") {

  $hiba = 0;

  if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
    if ($_FILES['userfile']['type']=="image/pjpeg") {
      $newfile = "../img/" . $userfile_name;
      if (copy($userfile, $newfile)) {
        $sql = "INSERT INTO proba1 (nev, foto, leiras) VALUES ('$nev', '$userfile_name', '$leiras')";
        mysql_query($sql);
      }
      else {
        $hiba = 1;
      }
    }
    else {
      $hiba = 1;
    }
  }
  else {
    $hiba = 1;
  }
8

Gondolat

s_volenszki · 2008. Szep. 11. (Cs), 10.45
Szia!

Az, hogy a képfájlt felülírja a rutinod, azon nincs semmi csodálkozni való, ugyan is az nem tartalmaz kritériumokat azzal kapcsolatban, hogy csak akkor másolhatja oda, ha nem létezik olyan nevű.

Ha azt akarod, hogy nevezze át, akkor írd hozzá a rutinhoz:

- A másolás előtt gyözödj meg a fájl meglétéről (file_exist())
- ha van, automatikusan prefixeld a kép nevét,

és mindjárt nincs felülírás

Ha egyszer a form beküldésekor nem hajtatsz végre semmilyen eseményt, akkor javaslom a submit típusú button használatát, így semmi értelme az onsubmit eseménynek.

Az, hogy nem rögzít rekordot az adatbázisban, ha nincs megadva kép... hát kérlek az a feltételed:

"Ha sikerül a feltöltött képet új néven másik könyvtárba másolni, akkor írd be az adatokat."

Ez elég egyértelmű.

Szerintem:

Nem teljesen érted, hogy mi is történik, ezért én a helyedben szétbontanám három fő egységre a problémát:

1. Kitapasztalnám (megtanulnám), hogyan kell htm formot php-nek elküldeni böngésző függetlenül, majd a php-ben hol találom meg a felküldött adatokat.

2. Egyszerű képfeltöltés és meglévő név figyelése egymezős form-ról.

3. Adatbázis művelet.

Egy kis olvasmány:
http://php.about.com/od/phpwithmysql/ss/Upload_file_sql.htm
http://www.blazonry.com/scripting/upload-size.php

Jó munkát:
s_volenszki
9

$_FILES['userfile']['type']=="image/pjpeg"

Poetro · 2008. Szep. 11. (Cs), 12.46
Lehet ám, hogy semelyik más böngésző nem ezt a tartalom típust adja vissza, hanem image/jpeg vagy valami más alternatívát, és egyébként se bízzunk a böngésző ezen igyekezetében, ugyanis ezt az adatot eléggé könnyű hamisítani.
10

???

enakos · 2008. Szep. 11. (Cs), 14.02
Vagyis mit kellene akkor a

$_FILES['userfile']['type']=="image/pjpeg


helyett?
11

File elemzés

janoszen · 2008. Szep. 11. (Cs), 14.46
Konkrétan meg kell nézned a fájlt, hogy JPG-e. Pl úgy, hogy betöltöd GD2-vel és ellenőrzöd, hogy nem ad-e hibát.
12

Ilyeneket találtam...

Ustak · 2008. Szep. 11. (Cs), 15.08
most kellet egy hasonlót csinálnom,bár én inkább javascriptben mozgok otthonosabban (csúnya szerveroldal :-)) de hátha segít:
Kiterjesztés:

 if (eregi('^image/p?jpeg(;.*)?$', $_FILES['upload']['type']) or eregi('^image/gif(;.*)?$', $_FILES['upload']['type'])) {  

     //jpg vagy gif filet fogadunk el és utána kezeljük mondjuk egy másik if-el ha az egyik vagy a másik pl:
     $kiterjesztes='.jpg';
}
egyedi fájlnév (időpont + ipcím)

    $faljnev='kepek/'.time().$_SERVER['REMOTE_ADDR'].$kiterjesztes;
Szóval ilyenek. Kaptam még errort tárolásnál hogy a copy függvény nem működik, mert a kepek könyvtáram nem volt írható, ezt egy 777 chmod megoldotta linux alatt (nem tudom ez mennyire biztonságos dolog, vagy így szokták -e csinálni-majd utánaolvasok egyszer normálisan.
Remélem segít!
13

Ő másra gondolt.

s_volenszki · 2008. Szep. 11. (Cs), 15.54
Szia!

Proclub egészen másra gondolt! Konkrétan arra, hogy az az ellenőrzés amit te teszel, az egy fajta külső jegyek ellenőrzése. Erre írták már feljebb, hogy viszonylag alacsony a bizalmi szint ezekkel az adatokkal, ugyanis könnyen hamisíthatóak (próbálj meg egy php fájlt átnevezni .jpg-re és a képfeltöltőddel feltölteni! Ha vannak felhasználóid és isten őrizz még fájlműveleteket is végezhetnek a saját feltöltött fájljaikkal...).

A másik ellenőrzési lehetőség az, hogy kiovasod a fájl tartalmat, konkrétan képként bánsz vele. Ha erre nincs hibaüzi, akkor tuti kép, és minden adata meglesz.
14

Kiterjesztés

janoszen · 2008. Szep. 11. (Cs), 16.01
A kiterjesztés semmire nem garancia. Konkrétan ha van egy exploit a JPG-ben, akkor beküldhet egy formai hibás JPG-t vagy általában bármilyen fájlt, ha neki az hasznára van. A legkevesebb ami történhet hogy tele leszel hibás fájlokkal. A legrosszabb egy feltört szerver. Nálam minimum egy képátméretezésen esnek át a képek, ezután már biztos hogy nem marad szemét. :)
15

Köszi

Ustak · 2008. Szep. 12. (P), 16.06
hiányos vagyok a zsinór szerver oldali részén, utána nézek eme dolgoknak mert most én is ilyen feladatot kaptam...