Seite 1 von 4

Datei Upload Tuning

Verfasst: Mi 15. Dez 2004, 16:47
von eLPiecho
Hallo,

ich möchte bei einer meiner Contenido Instalationen den Datei-Upload etwas Tunen. Und zwar soll wenn ein Bild hochgeladen wird, dieses gleich auf eine größe von x*y verkleinert werden. Außerdem soll (viel später) mal die Funktion entstehen, dass ein hochgeladenes Zip-Archiv automatisch entpackt wird und die enthaltenen Fotos dann anschließend auch verkleinert werden Aber das erst später.

Meine Frage nun welche Dateien betreffen den Upload und müßen geändert werden?? Gibt es etwas zu beachten oder gibt es vielleicht schon eine Erweiterung die so etwas kann??

Grüße aus HH
Lars

Verfasst: Mi 15. Dez 2004, 17:25
von kummer
nun, die frage die sich stellt ist: willst du die verkleinerung wirklich bereits beim upload vornehmen? oder nicht doch besser erst bei verwendung und in eine dann konfigurierbare grösse?

das würde dir etwas mehr flexibilität geben, falls du mal andere als die programmierten grössen der bilder benötigst.

Verfasst: Mi 15. Dez 2004, 17:44
von eLPiecho
Nun, die Sache ist die. Das ganze soll eine Art Schutzmechanismus vor DAUs sein. Ich möchte einfach eine maximale größe für Bilder angeben, die die Nutzer nicht ändern können. Zum einen soll das verhindern, dass ich die Script-Limits des Providers sprenge und zum anderen möchte ich auch nicht zuviel Speicherplatz für die Bilder verbrauchen.

Die Bilder würden auf eine Maximale Größe von 640*400 oder von mir aus auch etwas größer, verkleinert. Am liesten möchte ich das ganze dann auch noch mit ImageMagick lösen und JPEGs auf 70% Qualität reduzieren.

zur Zeit habe ich das Problem, das mein Kunde immer wieder mal ein Foto von der neuen Canon IXUS mit 5 Meagpixel, hochlädt. Dann bekommt er in der Dateiverwaltung im entsprechenden Verzeichnis nur noch einen Skriptfehler angezeigt, weil kein Thumb erzeugt werden kann. Dann muß ich das wieder per FTP ausbügeln und genau das möchte ich verhindern...

Verfasst: Mi 15. Dez 2004, 18:37
von kummer
ok! ich sehe die situation erfordert gnadenlose stringenz... :wink:

viel glück bei der umsetzung!

gruss,
andreas

Verfasst: Mi 22. Dez 2004, 00:13
von eLPiecho
:( grr...

OK, ich geb mich geschlagen... mit meinen drei Sätzen PHP und meinen schon ausgereifteren C Kenntnissen komme ich hier nicht weiter. Zwar habe ich im Contenido Code offenbar die richtigen Stellen gefunden (immer hin kann ich genau die Funktionen zerstören die ich ändern möchte 8) ), doch komme ich dann nicht wirklich weiter.

Leider fehlt mir auch die Zeit mich erst in PHP einzuarbeiten. Da werde ich zwar auf Dauer nicht drum rum kommen, aber jetzt geht das nicht.

Wenn das hier jemand liest, der sagt: "Das programmier ich Dir in der Kaffeepause!", oder der einen Vorschlag hat wie man das Problem (dass zu große Bilder auf den Server kommen) anderes serverseitig lösen kann, der möge sich bitte bei mir melden.

Weihnachtliche Grüße

Lars

PS: es muß natürlich nicht kostenlos sein, ich würde mich aber über ein kleines Weihnachtsgeschenk freuen... :wink:

Verfasst: Mi 22. Dez 2004, 12:39
von swelpot
hi,

ich denke, dass die folgende Veränderung der includes/include.upl_files_overview.php deiner ersten Intention genügen müsste.

(ab Zeile 107):

Code: Alles auswählen

if ($action == "upl_upload")
{
	$tempFilename = ""; //string
	$orgFilename = ""; //string
	$newFilename = ""; //string
	
	if (count($_FILES) == 1)
	{
		foreach ($_FILES['file']['name'] as $key => $value)
		{
			if (file_exists($_FILES['file']['tmp_name'][$key]))
			{
				$tempFilename = $_FILES['file']['tmp_name'][$key];
				$orgFilename = $_FILES['file']['name'][$key];
				$newFilename = uplCreateFriendlyName($orgFilename);
				
        		if (is_dbfs($qpath))
        		{
        			$dbfs->writeFromFile($tempFilename, $qpath.$newFilename);
        			unlink($tempFilename);
        
        		} else {
        			move_uploaded_file($tempFilename, $cfgClient[$client]['upl']['path'].$path.$newFilename);
        		}
        		
        		
        		$maxBildbreite = 640;
				$maxBildhoehe = 480;
				
				$filetype = strtolower(substr($newFilename, strlen($newFilename) -4, 4));
				
				if(strcmp(".gif", $filetype) == 0 ||
				   strcmp(".png", $filetype) == 0 ||
				   strcmp(".jpg", $filetype) == 0 ||
				   strcmp("jpeg", $filetype) == 0
				) {
					capiImgScale($newFilename, $maxBildbreite, $maxBildhoehe, false, false, 10, true);
				}
        		
			}
		}	
	}
}

die maximale Bildgröße ist jetzt zwar fest verankert, aber ein aufbohren der $cfg- oder $client-Variablen bleibt ja Dir überlassen...

Ich hoffe es funktioniert, testen klappt hier bei mir zur Zeit leider nicht. Kannst ja mal kurz Rückmeldung geben...

Grüße

Stefan

Verfasst: Do 23. Dez 2004, 14:15
von eLPiecho
Sorry ich konnte nicht feststellen, wo ich Deinen Code am besten einbaue in Zeile 107 der Datei steht bei mir:

Code: Alles auswählen

 $uploadform .=  '<tr class="text_medium" style="background-color: '.$cfg["color"]["table_dark"].';" >';
Da wird also gerade das Formular gebastelt. Ich konnte in der ganzen Datei keine stelle finden die auch nur im entferntesten mit Deinem Code übereinstimmt. Kannst Du mal die komplette Datei posten??

Verfasst: Do 23. Dez 2004, 14:27
von swelpot
der code ist für 4.5.2.
sorry, hab ich nicht erwähnt...
in 4.4.4 sieht die uploaderei komplett anders aus...
muss ich erst nochmal drüber schauen...

Verfasst: Do 23. Dez 2004, 16:27
von swelpot
so hier ist jetzt was für 4.4.4

datei contenido/includes/functions.upl.php
funktion uplupload(); Zeile 191:

Code: Alles auswählen

function uplupload($path,$userfile,$userfile_name,$userfile_size) {
        global $cfgClient, $client, $cfg, $db, $HTTP_POST_FILES;

        $ArrayCount = count($userfile);
        for ($i=0; $i<$ArrayCount; $i++)
        {
                if ($userfile_name[$i] && $userfile_size[$i]) {

                        $userfile_name[$i] = strtr($userfile_name[$i],'ÄÖÜäöüßé?>\/:\"*<>|#+','AOUaouse--------------');
                        //rplace space

                        $userfile_name[$i] =preg_replace("/\s/","",$userfile_name[$i]);

                        $file_type = substr(strrchr ($userfile_name[$i], "."),1);
                        $file_type = strtolower($file_type);
                        $userfile_name[$i]=substr_replace($userfile_name[$i],$file_type,strrpos($userfile_name[$i],".")+1);


                        if (ereg("".$cfgClient['upl']['forbidden']."",strtolower($userfile_name[$i]))) {
                                $errno = "0705";
                        } else {

                                if (@move_uploaded_file($userfile[$i],$cfgClient[$client]['upl']['path'].$path.$userfile_name[$i])) {
										chmod($cfgClient[$client]['upl']['path'].$path.$userfile_name[$i],0644);


										//Hochgeladene Bild sofort auf maximale Größe verkleinern
										$maxBildbreite = 640;
										$maxBildhoehe = 480;
										
										$filetype = strtolower(substr($userfile_name[$i], strlen($userfile_name[$i]) -4, 4));
										
										if(strcmp(".gif", $filetype) == 0 ||
										   strcmp(".png", $filetype) == 0 ||
										   strcmp(".jpg", $filetype) == 0 ||
										   strcmp("jpeg", $filetype) == 0
										) {
											capiImgScale($cfgClient[$client]['upl']['path'].$path.$userfile_name[$i], $maxBildbreite, $maxBildhoehe, false, false, 10);
										}


                                        $file_time = filemtime($cfgClient[$client]['upl']['path'].$path.$userfile_name[$i]);
                                        //$file_time = date("Y-m-d H:i:s", $file_time);


                                        $sql = "SELECT idupl
                                                FROM ".$cfg["tab"]["upl"]."
                                                WHERE idclient='$client' AND filename='$userfile_name[$i]' AND dirname='$path' AND filetype='$file_type'";

                                        $db->query($sql);
                                        if ($db->next_record()) {

                                        } else {
                                                $sql = "INSERT INTO ".$cfg["tab"]["upl"]."
                                                                (idupl, idclient, filename, dirname, filetype, size, description, created, lastmodified)
                                                                VALUES
                                                                ('".$db->nextid($cfg["tab"]["upl"])."', '$client','$userfile_name[$i]','$path','$file_type','$userfile_size[$i]','', now(), now())";

                                                $db->query($sql);

                                        }

                                }

                                else {
                                        $errno = "0703";
                                }
                        }
                }
        }

        if ( isset($errno) ){
                return $errno;
        }
}
Grüße

Stefan

Verfasst: Di 28. Dez 2004, 19:50
von NobodyBody
Hallo,

soweit so gut; das Bild wird verkleinert im cache-Verzeichnis angelegt. :wink:
Wo muß ich aber eingreifen, damit ich das verkleinerte Bild in der Backend/Dateiverwaltung mit allen richtigen Daten (Dateigröße, Bildgröße) vorfinde.

In der Datei 'include.upl_files_overview.php' habe ich schon den Aufbau der Dateiverwaltung gefunden, aber wenn ich den Button 'Datei hochladen'
auslöse, ist mir nicht klar welche weiteren Funktionen ausgeführt werden.:roll:

Kann mir jemand einen kleinen Tipp geben, wo ich hier anfassen muß :?:

mfg

Verfasst: Mi 29. Dez 2004, 09:13
von Dodger77
swelpot hat geschrieben:so hier ist jetzt was für 4.4.4

datei contenido/includes/functions.upl.php
funktion uplupload(); Zeile 191:
[...]
Je nach eingesetzter GD-Version ist es wahrscheinlich sinnvoll anstatt capiImgScale die Funktion capiImgScaleHQ (ab GD 2.x) zu nutzen. Das dürfte etwas schönere Ergebnisse produzieren.

Verfasst: Sa 19. Feb 2005, 17:45
von clemens
hallo könntet ihr mir das noch einmal genauer erklären, wie das funktioniert und was ich tun muss, um einen upload resize zu bekommen!?

ich bräuchte dringendst so eine funktion, meine redakteure zerschießen mir ständig die layouts mit zu grpßen bildern!

danke im voraus!

dateiverwaltung - upload resizen mit 4.4.5 ?

Verfasst: Fr 13. Mai 2005, 12:06
von adifl
hallo

hab den code ausgetauscht in functions.upl.php, bei mir wird aber nichts geändert in der grösse des Bildes.jpg ? wenn ich in der Dateiverwaltung Bilder uploade.

vielen dank, adifl

Update für v4.6.4

Verfasst: Mi 28. Dez 2005, 19:07
von swelpot
Hallo,

ich habe die oben beschriebene Funktionalität mal auf v4.6.4 gehoben.
Die Umsetzung geschieht jetzt dank Chains etwas einfacher.

Die maximale Bildbreite/-höhe ist über die Mandanteneinstellungen konfigurierbar. Ob eine Bildskalierung beim Upload tatsächlich stattfindet wird über die Benutzer- bzw. Gruppeneinstellungen definiert.

Weitere Anleitung findet sich im Kommentar der Chain.


Hier die Chain:
(als Datei include.chain.upload.upload_preprocess.php im Verzeichnis contenido/plugins/chains/includes erstellen)

Code: Alles auswählen

<?php
/**
 * include.chain.upload.upload_preprocess.php
 *
 * Automatische Bildskalierung beim Upload von Bildern in der Dateiverwaltung
 *
 * maximale Bildbreite/-höhe über die Mandanteneigenschaften
 *   - upload, automaticImageScaleWidth, maximale Bildbreite
 *   - upload, automaticImageScaleHeight, maximale Bildhöhe
 * Einschalten der Bildskalierung über die Benutzer- bzw. Gruppeneinstellungen
 *   - upload, automaticImageScale, true
 *
 * Einbinden der Chain in Datei "contenido/plugins/chains/includes/config.plugin.php":
 * cInclude("plugins", "chains/includes/include.chain.upload.upload_preprocess.php");
 * $_cecRegistry->addChainFunction("Contenido.Upload.UploadPreprocess", "cecUploadUploadPreprocess");
 *
 * @version 1.0
 * @author Stefan Welpot
 * 28.12.2005
 */
cInclude('classes', 'contenido/class.client.php');

function cecUploadUploadPreprocess ($tmp_name, $path)
{
  global $auth, $cfgClient, $client;
  $defaultBildbreite = 640;
  $defaultBildhoehe = 480;
  
  // nur wenn ImageScale für den Benutzer aktiviert ist
  $currentuser = new User;
  $currentuser->loadUserByUserID($auth->auth["uid"]);
  if($currentuser->getUserProperty("upload", "automaticImageScale", true)) {
  
    // maximale Bildgröße über Mandanteneinstellungen
    /*
    $properties = new PropertyCollection;
    $maxBildbreite = $properties->getValue("clientsetting", $client, "upload", "automaticImageScaleWidth");
    $maxBildhoehe = $properties->getValue("clientsetting", $client, "upload", "automaticImageScaleHeight");
    */ 

    $cApiClient = new cApiClient($client);
    $maxBildbreite = $cApiClient->getProperty("upload", "automaticImageScaleWidth");
    $maxBildhoehe = $cApiClient->getProperty("upload", "automaticImageScaleHeight");
    
    
    if(!is_numeric($maxBildbreite)) {
      $maxBildbreite = $defaultBildbreite;
    }
    if(!is_numeric($maxBildhoehe)) {
      $maxBildhoehe = $defaultBildhoehe;
    }
    
    $newFilename = "";
    
    $filetype = strtolower(substr($tmp_name, strlen($tmp_name) -4, 4));
    if(strcmp(".gif", $filetype) == 0 ||
       strcmp(".png", $filetype) == 0 ||
       strcmp(".jpg", $filetype) == 0 ||
       strcmp("jpeg", $filetype) == 0
    ) {
       $newFilename = capiImgScale($tmp_name, $maxBildbreite, $maxBildhoehe, false, false, 1, true);
    }
    $newFilename = str_replace($cfgClient[$client]["path"]["htmlpath"], $cfgClient[$client]["path"]["frontend"], $newFilename);
    return $newFilename;
  }
  
  return false;
}
?>

Re: Datei Upload Tuning

Verfasst: Mi 28. Dez 2005, 19:08
von swelpot
und gleich hinterher noch eine Frage an eLPiecho:
eLPiecho hat geschrieben:Außerdem soll (viel später) mal die Funktion entstehen, dass ein hochgeladenes Zip-Archiv automatisch entpackt wird und die enthaltenen Fotos dann anschließend auch verkleinert werden Aber das erst später.
Gibts den Zip-Upload schon?