2017-01-07 3 views
1

Also mache ich einen Bild-Uploader, wo ich Thumbnails machen möchte, aber auch Svg unterstützt, da GD Svg-Typen nicht unterstützt, habe ich zuerst versucht, zu wechseln Imagick in der Datei config/image.php, aber das hat nichts geändert.Bild kann nicht aus der Datei gelesen werden. SVG (Intervention/Bild)

Worüber ich unsicher bin, da es besagt, dass es dies unterstützt, fehlt mir ein benötigtes Paket, das ich installieren muss? Wenn ja, welcher?.

Aber mit dieser sagte, wenn ich versuche, ein SVG-Bild laden heißt es:

NotReadableException in Decoder.php line 20: 
Unable to read image from file (D:\xampp\htdocs\laravel\public\up/2017/01/07000323-logoSep.svg). 

Ich versuchte zunächst, dies mit einem einfachen IF-Struktur Bekämpfung, wie ich wirklich nicht einen Thumbnail für SVG-Bilder benötigen, mit -> mime(), aber dann hieß es auch, das Bild konnte nicht geöffnet/gelesen werden.

$image = $request->file('file'); 
$imageName = date("dHis-").$image->getClientOriginalName(); 
$uploadPath = public_path('up/').date("Y/m"); 
$image->move($uploadPath,$imageName); 
$imageMime = Image::make($uploadPath.'/'.$imageName); 
if($imageMime->mime() != "image/svg+xml"){} 

Damit ich zuerst dachte, dies durch ein Berechtigungsproblem verursacht wurde, damit ich sicher, dass alle meine Dateien gelesen und beschreibbar gemacht, aber das hat nicht das Problem ändern. So

Ich versuchte, mich auf der tatsächlichen Erweiterung zu stützen, anstatt der MIME-Typ, der etwas in meinem Fall wie folgt funktioniert:

public function dropzoneStore(Request $request){ 
    $image = $request->file('file'); 
    $imageName = date("dHis-").$image->getClientOriginalName(); 
    $uploadPath = public_path('up/').date("Y/m"); 
    $image->move($uploadPath,$imageName); 
    if($image->getClientOriginalExtension() != 'svg'){ 
     $imageThmb = Image::make($uploadPath.'/'.$imageName); 
     $imageThmb->fit(300,300,function($constraint){$constraint->upsize();})->save($uploadPath.'/thm_'.$imageName,80); 
    } 
    return response()->json(['success'=>$imageName]); 
} 

Aber ich finde dies ein eher hackish Ansatz. Gibt es keine bessere Möglichkeit, SVG-Typen mit dem gesamten Interventions/Image-Paket herauszufiltern oder zu unterstützen?

Vielen Dank im Voraus für weitere Informationen!

+0

Leider Intervention nicht SVGs unterstützt, und obwohl "Imageick" SVGs unterstützt, wird es nicht auf die Weise funktionieren, die Sie wollen. Dies liegt daran, dass selbst 'Imageick' die Größenänderung in der SVG-Datei nicht unterstützt. Ich würde vorschlagen, dass der Benutzer es vor dem Hochladen in ein PNG oder anderes konvertiert oder eine JavaScript-Bibliothek verwendet, um es in eine PNG-Datei zu konvertieren, bevor es in ein HTML5-Canvas-Element gerendert wird. Viel Glück. – Ohgodwhy

+0

Okay, das erklärt, warum GD und Imageick das Problem nicht geändert haben. Allerdings möchte ich das SVG-Bildformat beibehalten und nicht konvertieren. Ich benötige eigentlich keine Daumen für das SVG-Bild, da es sich in der Größe ändert, da es SVG ist, aber ich muss einen Weg finden, um den Fehler zu umgehen. Der aktuelle Weg es umgeht nur die Erstellung der Daumen, wenn die Dateiendung Svg enthält. Und während dies für die Erstellung des Daumens funktioniert, ist es so, dass mein anderes Dateisystem auf die gesamte Erstellung des Daumens angewiesen ist und dann eine erneute Prüfung für svg erfordert. –

+0

Also ich bin mir nicht sicher, ob es einen einfacheren Weg geben würde, damit umzugehen, es ist ein bisschen blöd, die Datei zweimal in den Daumen und eine im Original zu speichern, wenn die Datei die selbe ist. Aber da mein Dateisystem alle neuen Bilder basierend auf den Thumbs/Thm verwendet, bin ich mir jetzt nicht sicher, ob es nicht nur eine gute Idee wäre, es so zu machen oder einen Filter auf jedem Checker hinzuzufügen, auf dem es verwendet wird Dateipfad zu Thumbs. PS: diese 500 Zeichen Grenze Kommentare sind ziemlich ärgerlich: | –

Antwort

2

So mit weiteren Experimenten und versucht, etwas zu bekommen, mit dem Aufenthalt der Intervention/Bildbibliothek zu arbeiten, aber ohne das svg zu etwas Umwandlung ich mit folgenden Lösung gegangen bin:

public function dropzoneStore(Request $request){ 
    $image = $request->file('file'); 
    $imageName = date("dHis-").preg_replace("/[^a-zA-Z0-9.]/","",$image->getClientOriginalName()); 
    $uploadPath = public_path('up/').date("Y/m"); 
    $image->move($uploadPath,$imageName); 
    //Thumbnail Creation 
    $thumbPath = $uploadPath.'/thumbs/'; 
    File::isDirectory($thumbPath) or File::makeDirectory($thumbPath,0775,true,true); 
    if($image->getClientOriginalExtension() != 'svg'){ 
     $imageThmb = Image::make($uploadPath.'/'.$imageName); 
     $imageThmb->fit(300,300,function($constraint){$constraint->upsize();})->save($uploadPath.'/thumbs/thm_'.$imageName,80); 
    }else{ 
     File::copy($uploadPath.'/'.$imageName,$uploadPath.'/thumbs/thm_'.$imageName); 
    } 
    return response()->json(['success'=>$imageName]); 
} 

Welche während eines Bit weit hergeholt und ein hacky Ansatz in meinen Augen, scheint immer noch den Trick zu machen, neben meinem Dateisystem zu arbeiten, das einen Daumen für jedes Bild erfordert.

Während ich es trotzdem untersuchen könnte, wenn ich die Verwendung meiner Website erweitern, um schließlich die SVG-Bilder zu Thumbnails zu konvertieren. Aber für den Moment wird dies tun und da .svg's noch nicht für die Website-Entwicklung verwendet werden, kann ich mich auch in Bezug auf die Auslastung wohl fühlen.

In jedem Fall danke ich allen, die mir bei dieser Angelegenheit geholfen haben!

Verwandte Themen