Datei Upload Tuning
Datei Upload Tuning
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
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
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.
das würde dir etwas mehr flexibilität geben, falls du mal andere als die programmierten grössen der bilder benötigst.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
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...
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...
ok! ich sehe die situation erfordert gnadenlose stringenz...
viel glück bei der umsetzung!
gruss,
andreas
viel glück bei der umsetzung!
gruss,
andreas
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
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 ), 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...
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 ), 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...
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):
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
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
Sorry ich konnte nicht feststellen, wo ich Deinen Code am besten einbaue in Zeile 107 der Datei steht bei mir:
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??
Code: Alles auswählen
$uploadform .= '<tr class="text_medium" style="background-color: '.$cfg["color"]["table_dark"].';" >';
so hier ist jetzt was für 4.4.4
datei contenido/includes/functions.upl.php
funktion uplupload(); Zeile 191:
Grüße
Stefan
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;
}
}
Stefan
-
- Beiträge: 80
- Registriert: Di 14. Sep 2004, 08:14
- Kontaktdaten:
Hallo,
soweit so gut; das Bild wird verkleinert im cache-Verzeichnis angelegt.
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.
Kann mir jemand einen kleinen Tipp geben, wo ich hier anfassen muß
mfg
soweit so gut; das Bild wird verkleinert im cache-Verzeichnis angelegt.
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.
Kann mir jemand einen kleinen Tipp geben, wo ich hier anfassen muß
mfg
-
- Beiträge: 3626
- Registriert: Di 12. Okt 2004, 20:00
- Wohnort: Voerde (Niederrhein)
- Kontaktdaten:
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.swelpot hat geschrieben:so hier ist jetzt was für 4.4.4
datei contenido/includes/functions.upl.php
funktion uplupload(); Zeile 191:
[...]
dateiverwaltung - upload resizen mit 4.4.5 ?
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
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
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)
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;
}
?>
Grüße
Stefan
Stefan
Re: Datei Upload Tuning
und gleich hinterher noch eine Frage an eLPiecho:
Gibts den Zip-Upload schon?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.
Grüße
Stefan
Stefan