2015-08-18 14 views
11

Ich bin mit folgendem Problem konfrontiert und kann nicht scheinen, dieses herauszufinden. Ich habe einen API-Endpunkt geschrieben, der einen POST mit binären Daten akzeptiert (header: content-type: image/jpeg).Manuelles Erstellen eines Symfony UploadedFile

Ich weiß, ich kann die rohe Zeichenfolge mit file_get_content('php://input') oder Laravels $request->getContent() auslesen. PHP hat auch eine Funktion createimagefromstring($string), die auch die Zeichenfolge korrekt zu lesen scheint.

Ich möchte aus diesen Rohdaten ein UploadedFile erstellen, damit ich mit bereits geschriebenen Funktionen umgehen kann.

Ist das möglich?

Vielen Dank im Voraus

Antwort

3

Ich glaube, ich fand es ... Immer noch neugierig, ob es Verbesserungen, die gemacht werden können ..

$imgRaw = imagecreatefromstring($request->getContent()); 
if ($imgRaw !== false) { 
    imagejpeg($imgRaw, storage_path().'/tmp/tmp.jpg',100); 
    imagedestroy($imgRaw); 
    $file = new UploadedFile(storage_path().'/tmp/tmp.jpg', 'tmp.jpg', 'image/jpeg',null,null,true); 
    // DO STUFF WITH THE UploadedFile 
} 
1

Es gibt keine Notwendigkeit, ihn manuell zu erstellen, Symfony Parsen empfing $ _FILES-Array für Sie. Das Http-Request-Objekt hat eine FileBag-Eigenschaft namens $ files mit einer get() -Methode, die eine UploadedFile-Instanz zurückgibt.

/** @var UploadedFile $file */ 
$file = $request->files->get('user-pictures-upload')[0]; 
$cmd = new UploadPictureCmd($file, $this->getUser()->getId()); 
0

Wenn es für irgendetwas zählt, so habe ich es in Laravel 5.4 gemacht. In meinem Fall wollte ich in der Lage sein, ein Bild leicht zu skalieren und so etwas zu machen.

request()->file('image')->resize(250, 250)->store('path/to/storage'); 

Dies ist, was ich mit der UploadedFile-Klasse gemacht habe.

Illuminate \ Http \ UploadedFile.php ~ Diese Datei wird mit dem Laravel Rahmen

public function resize($w, $h) { 

$image = Intervention::make($this)->fit($w, $h)->save($this->getPathname()); 
$filesize = filesize($this->getPathname()); 

    return new static(
     $this->getPathname(), 
     $this->getClientOriginalName(), 
     $this->getClientMimeType(), 
     $filesize, 
     null, 
     false 
    ); 
} 

Intervention Unter Verwendung der Größe verändert ich das Bild, das im Verzeichnis/tmp/Ordner gespeichert wird, wenn Dateien hochgeladen werden und dann Ich habe es am selben Ort gespeichert. Alles, was ich danach mache, ist eine Instanz von UploadedFile zu erstellen, damit ich Laravels Methoden weiterhin unter request()->file('image') verwenden kann. Hoffe das hilft.

0

Sie können versuchen, base64-Codierung zu verwenden. Symfony hat ein paar nette Sachen dafür.

Ihr Code wird wie folgt sein smthng:

$base64Content = $request->request->get('base64Content'); // this is your post data 
$yourFile = new UploadedBase64EncodedFile(new Base64EncodedFile($base64Content)); // this is an instance of UploadedFile 

Hoffe, es hilft!

Verwandte Themen