Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

Im Vtiger Customer Portal gibt es einen kleinen Bug: Beim Herunterladen von Dateien tritt ein Fehler auf, sodass der Benutzer eine Datei mit einer Größe von 0 Byte erhält. Dieser Fehler tritt nicht in allen Fällen auf, sondern nur dann, wenn der Dateiname einen inkorrekten Syntax enthält. Die Lösung besteht darin, einige Anpassungen an der Datei modules/CustomerPortal/modules/CustomerPortal/apis/DownloadFile.php vorzunehmen.

Vtiger Customer Portal – Problembehebung: Herunterladen einer leeren Datei verhindern

Im Vtiger Customer Portal gibt es einen kleinen Bug: Beim Herunterladen von Dateien tritt ein Fehler auf, sodass der Benutzer eine Datei mit einer Größe von 0 Byte erhält. Dieser Fehler tritt nicht in allen Fällen auf, sondern nur dann, wenn der Dateiname einen inkorrekten Syntax enthält. Die Lösung besteht darin, einige Anpassungen an der Datei modules/CustomerPortal/modules/CustomerPortal/apis/DownloadFile.php vorzunehmen. Diese Datei ist verantwortlich für die Suche und Übergabe der angeforderten Datei im Customer Portal.

Im Folgenden führen wir Schritt für Schritt die notwendigen Änderungen aus.

  1. Anpassung der Abfrage und Initialisierung der Dateinamenvariablen

Suchen Sie in DownloadFile.php den folgenden Codeabschnitt:

$filepathQuery = 'SELECT path,name FROM vtiger_attachments WHERE attachmentsid = ?';
$fileres = $adb->pquery($filepathQuery, array($fileid));
$filepath = $adb->query_result($fileres, 0, 'path');
$filename = $adb->query_result($fileres, 0, 'name');
$filename = decode_html($filename);

Löschen Sie diesen Block und ersetzen Sie ihn durch:

$filepathQuery = 'SELECT path,name,storedname FROM vtiger_attachments WHERE attachmentsid = ?';
$fileres = $adb->pquery($filepathQuery, array($fileid));
$filepath = $adb->query_result($fileres, 0, 'path');
if ($adb->query_result($fileres, 0, 'storedname')) { 
     $filename = $adb->query_result($fileres, 0, 'storedname');
} else {
     $filename = $adb->query_result($fileres, 0, 'name');
}
$realfilename = decode_html($adb->query_result($fileres, 0, 'name'));

Erklärung:
Durch die erweiterte Abfrage (Hinweis: Es wird zusätzlich das Feld storedname abgefragt) prüfen wir, ob ein korrekter, im Dateisystem vorhandener, Dateiname vorliegt. Der tatsächliche Name der Datei wird dabei in der Variablen realfilename gespeichert, während $filename zunächst aus der Datenbank gezogen wird.

  1. Anpassung an der Stelle, an der der Dateiname in den Dateidetails genutzt wird

Suchen Sie in der Datei ungefähr um Zeile 72 den Code:

$saved_filename = $fileid."_".$filename;
$filenamewithpath = $filepath.$saved_filename;
$filesize = filesize($filenamewithpath);
$fileDetails = array();
$fileDetails['fileid'] = $fileid;
$fileDetails['filename'] = $filename;

Ändern Sie diesen Abschnitt in folgenden Code:

$saved_filename = $fileid."_".$filename;
$filenamewithpath = $filepath.$saved_filename;
$filesize = filesize($filenamewithpath);
$fileDetails = array();
$fileDetails['fileid'] = $fileid;
$fileDetails['filename'] = $realfilename;

Hier wird anstelle des ursprünglichen Namens der tatsächliche Dateiname ($realfilename) in den Dateidetails gespeichert, sodass der Endbenutzer stets den richtigen Namen erhält.

  1. Anpassung innerhalb weiterer Bereiche des Codes (ca. Zeile 88)

Suchen Sie den Codeabschnitt:

$fileid = $attachmentDetails['attachmentsid'];
$filename = $attachmentDetails['name'];
$filepath = $attachmentDetails['path'];

Ersetzen Sie ihn durch:

$fileid = $attachmentDetails['attachmentsid'];
$filename = $attachmentDetails['storedname'];
if (empty($filename)) {
    $filename = $attachmentDetails['name'];
}
$filepath = $attachmentDetails['path'];
$realfilename = decode_html($attachmentDetails['name']);

Durch diese Änderung wird erneut sichergestellt, dass der korrekte (tatsächliche) Dateiname aus dem Field storedname, falls vorhanden, genutzt wird. Existiert dort kein Wert, wird der ursprüngliche Name aus dem Feld name verwendet. Zusätzlich wird die Variable realfilename entsprechend gesetzt.

  1. Letzte Anpassung in etwa Zeile 100

Suchen Sie die folgende Zeile:

$fileDetails['filename'] = $filename;

Ersetzen Sie sie durch:

$fileDetails['filename'] = $realfilename;

Auch hier wird der tatsächliche Dateiname in den Dateidetails gespeichert.

Fazit

Nach Durchführung dieser Anpassungen werden Dateien im Vtiger Customer Portal korrekt heruntergeladen – auch wenn der Dateiname fehlerhaft formatiert war. Die Änderungen stellen sicher, dass der korrekte Name, wie er im Dateisystem existiert, ermittelt und dem Benutzer übermittelt wird. So vermeiden Sie, dass Benutzer leere Dateien erhalten. Durch die Überprüfung und gezielte Zuweisung von storedname bzw. der Normalisierung mit decode_html wird das Problem zuverlässig behoben.