Probleme bei Excel-Exporte mittels PhpOffice

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Servus!

Müsste mal ein aktuelles Problem angehen...

Ich verwende in einem PHP-Tool PhpOffice (/PhpSpreadsheet).
Mit Hilfe dessen, exportiere ich ein paar Daten aus dem Tool als Excel-Tabelle.
In dieser Tabelle werden auch Bild-Dateien vom Server exportiert und dem
entsprechenden Datensatz hinzugefügt.

Dazu verwende ich den folgenden Code:

PHP:
  $gdImage = imagecreatefromjpeg("excel_upload/uploads_x/$rowID.jpg");
  $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing();
  $objDrawing->setName('Foto');
  $objDrawing->setDescription('Foto');
  $objDrawing->setImageResource($gdImage);
  $objDrawing->setRenderingFunction(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::RENDERING_JPEG);
  $objDrawing->setMimeType(\PhpOffice\PhpSpreadsheet\Worksheet\MemoryDrawing::MIMETYPE_DEFAULT);
  //$objDrawing->setWidth(60);
  $objDrawing->setWidthAndHeight(45,60);
  $objDrawing->setResizeProportional(true);
  $objDrawing->setCoordinates('G'.$z);
  $objDrawing->setOffsetX(8);
  $objDrawing->setOffsetY(18);
  $objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
  $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($objPHPExcel, 'Xlsx');
  $objWriter->save(str_replace('.php', '.xlsx', __FILE__));

Das funktioniert auch soweit genau so, wie es soll.
Nun kommt es leider vor - dass an Stelle der .JPG-Files dann .PNG-Files hochgeladen werden,
dessen Endung aber dennoch .jpg ist. Dies erkenne ich mit einem Hex-Editor.
Problem ist es dann, dass die Daten zwar exportiert werden und das Excel-Sheet herunterge-
laden werden kann, ich dieses aber leider nicht öffnen kann.

Finde ich diese fehlerhaften Files und speichere sie erneut als JPG, funktioniert es. Habt ihr einen Vorschlag,
wie ich das Problem auf PHP-Ebene ggf. lösen kann? Ich habe leider noch nicht die Möglichkeit, die Files
direkt auf Ebene der Erstellung vor dem Upload auf dem Server zu korrigieren. Da fehlt mir noch der Zugriff.

Grüße.
 
Kannst du mit PHP prüfen ob es sich um ein PNG oder JPG handelt? Falls ja könntest du die Datei die eingebunden wird mittels: imagecreatefrompng() in ein JPG umwandeln.

Du könntest mal versuche so zu prüfen ob du bei den "falschen jpg" Files als Mimetype ein "image/png" bekommst:

PHP:
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type - all mimetype extension
$filename = "deinfalschesjpgbild.jpg";
echo $filename . ": " . finfo_file( $finfo, $filename ) . "<br>";

Falls das klappt kannst du die betroffenen Bilder umwandeln:

z.b. mit der Funktion:

PHP:
// Quality is a number between 0 (best compression) and 100 (best quality)
function png2jpg($originalFile, $outputFile, $quality) {
    $image = imagecreatefrompng($originalFile);
    imagejpeg($image, $outputFile, $quality);  //$outputFile = Pfad und Dateiname wo das neue Bildgespeichert werden soll: z.b.: /pfad/auf/server/neuesjpgbild.jpg
    imagedestroy($image);
}
 
Zurück
Oben