Entwickler-Ecke

Sonstiges (Web-Entwicklung) - Problem mit FileUpload mit copy()


koller1 - Do 06.09.07 22:13
Titel: Problem mit FileUpload mit copy()
Hallo!
Habe hier ein Problem und komme mit der Lösung nicht weiter.
Unzwar habe ich ein Formular zum Eintragen von Lehrern einer Schule (programmiere mit einem Freund eine Schulhomepage) und da soll man auch Bilder hochladen können.
Unzwar nutze ich dafür <input type='file' ......./>. Soweit so gut. Nun will ich aber neben der Datei, die z.B. mmueller.jpg heißt noch eine weitere hochladen namens mmueller_thumb.jpg. Die zweite Datei hat immer den Namen der ersten +_thumb hinten dran. Dieses Bild ist kleiner von der Dateigröße her. Da die _thumb-Datei immer im gleichen Ordner liegt, wie ihr "großer Bruder", möchte ich die Datei automatisch hochladen, ohne den Nutzer die Datei wieder auswählen zu lassen. Nun habe ich versucht den bei <input type='file'........./> angegeben Pfad in einem Hidden-Button zu speichern, was auch geklappt hat. Aber wenn ich diese Pfad dann bei copy() als erstes Argument einsetze, klappt es net. Und da $_FILES['file']['tmp_name'] auch nichts aussagt, wollte ich mal fragen, wie ich die zweite Datei uploaden kann, ohne eine weitere Benutzereingabe.
Habt ihr da ne Idee?
MFG
koller1


Marco D. - Do 06.09.07 22:19

Ich hab da eine Idee, wie man das mit JS lösen kann. Ich poste weitere Einzelheiten morgen.


DarkHunter - Fr 07.09.07 23:10

Wäre es nicht einfacher, aus dem Ursprungsbild mithilfe der PHP-Image-Funktionen ein Thumbnail zu erstellen?

Damit bräuchte man weniger Traffic von Userseite.
Außerdem kann man so die Dimensionen des Thumbs genau anpassen.

Die Funktion erwartet den Namen des Bildes als String.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function create_thumbnail($image,$size = array(140,100),$prefix = "t_"){
  $im = getImage($image);
  $w = imagesx($im);
  $h = imagesy($im);
  $wf = $w / $size[0];
  $hf = $h / $size[1];
  if ($wf > $hf) {
    $tw = $size[0]; //Thumbnail width
    $th = $h / $wf;
  } else {
    $tw = $w / $hf;
    $th = $size[1]; //Thumbnail height
  }
  $thumb = imagecreatetruecolor($tw,$th);
  imagecopyresized($thumb,$im,0,0,0,0,$tw,$th,$w,$h);
  saveImage($thumb,$prefix.$image);
  imagedestroy($im);
}


Die beiden aufgerufenen Funktionen SaveImage() und getImage() sehen wie folgt aus.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
function getImage($f){
  $ext = fileext($f);
  if ($ext == "jpeg" || $ext == "jpg")
    $im = imagecreatefromjpeg($f);
  else if ($ext == "gif")
    $im = imagecreatefromgif($f);
  else if ($ext == "png")
    $im = imagecreatefrompng($f);
  return $im;
}

function saveImage($imgHnd,$file){
  $ext = fileext($file);
  if ($ext == "jpeg" || $ext == "jpg")
    imagejpeg($imgHnd,$file);
  else if ($ext == "gif")
    imageGIF($imgHnd,$file);
  else if ($ext == "png")
    imagePNG($imgHnd,$file);
  imagedestroy($imgHnd);
}

function fileext($file){
  if (strpos($file,".")){
    $file_array = explode(".",$file);
    return strtolower($file_array[count($file_array)-1]);
  }
  else{
    return "";
  }
}


Regan - Sa 08.09.07 17:05

user profile iconDarkHunter hat folgendes geschrieben:
Wäre es nicht einfacher, aus dem Ursprungsbild mithilfe der PHP-Image-Funktionen ein Thumbnail zu erstellen?

Vollkommen richtig. Die Thumbnail-Erstell-Funktion hat auch den Vorteil: Sollte mal ein Thumbnail nicht verfügbar (rein zufällig gelöscht) oder nicht verwendbar (weil noch von einem anderen Programm verwendet) sein, wird diese automatisch erstellt. Somit brauchst du, als Nutzer, nie mehr ein Thumbnail zu erstellen. Du solltest natürlich entsprechende Schreibrechte haben. Somit ist die Wartung auch viel einfacher. Wenn du ein neues Bild hochlädst, wird das Alte automatisch überschrieben.