2015-08-18 16 views
11

Sono di fronte al seguente problema e non riesco a capire questo fuori. Ho scritto un endpoint API che accetta un POST con dati binari (intestazione: content-type: image/jpeg).creazione manuale di un file caricato Symfony

So che posso leggere la stringa raw con file_get_content('php://input') o Laravel $request->getContent(). PHP ha anche una funzione createimagefromstring($string) che sembra anche leggere correttamente la stringa.

Quello che mi piacerebbe fare è creare un file caricato da questi dati grezzi, in modo che io possa gestirlo con funzioni già scritte.

È possibile?

Grazie in anticipo

risposta

3

Credo di aver trovato ... Ancora curioso di sapere se ci sono miglioramenti che possono essere fatte ..

$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

Non v'è alcuna necessità di creare manualmente, analizza Symfony ricevuto $ _FILES array per te. L'oggetto Http Request ha una proprietà FileBag chiamata $ files con un metodo get() che restituisce un'istanza UploadedFile.

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

Se conta qualcosa, è così che l'ho fatto in Laravel 5.4. Nel mio caso, volevo essere in grado di ridimensionare facilmente un'immagine ed essere in grado di fare qualcosa di simile.

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

Questo è quello che ho fatto alla classe UploadedFile.

Illuminate \ Http \ UploadedFile.php ~ questo file fornito con il quadro laravel

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 
    ); 
} 

Utilizzando Intervention, ho ridimensionato l'immagine che viene memorizzato nella tmp/cartella/quando vengono caricati i file e poi L'ho salvato nello stesso posto. Ora tutto ciò che faccio dopo è creare un'istanza di UploadedFile in modo da poter continuare a utilizzare i metodi di Laravel su request()->file('image'). Spero che questo ti aiuti.

0

È possibile provare a utilizzare la codifica base64. Symfony ha delle cose carine per questo.

Il codice sarà smthng in questo modo:

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

Speranza che aiuta!