Вручную создавая Symfony UploadedFile
Я столкнулся с следующей проблемой и, похоже, не могу понять этого.
Я написал конечную точку API, принимающую POST с двоичными данными (header: content-type: image/jpeg).
Я знаю, что могу прочитать исходную строку с file_get_content('php://input')
или Laravel $request->getContent()
.
PHP также имеет функцию createimagefromstring($string)
, которая также, кажется, правильно читает строку.
Что бы я хотел сделать, это создать UploadedFile из этих необработанных данных, чтобы я мог справиться с уже написанными функциями.
Возможно ли это?
Заранее благодарю
Ответы
Ответ 1
Я думаю, что нашел... Еще интересно, есть ли улучшения, которые могут быть сделаны.
$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
}
Ответ 2
Нет необходимости вручную создавать его, Symfony анализирует полученный массив $_FILES. Объект запроса Http имеет свойство FileBag, называемое $файлами, с методом get(), который возвращает экземпляр UploadedFile.
/** @var UploadedFile $file */
$file = $request->files->get('user-pictures-upload')[0];
$cmd = new UploadPictureCmd($file, $this->getUser()->getId());
Ответ 3
Если он рассчитывает на что-либо, так я сделал это в Laravel 5.4. В моем случае я хотел иметь возможность легко изменять размер изображения и быть в состоянии сделать что-то вроде этого.
request()->file('image')->resize(250, 250)->store('path/to/storage');
Это то, что я сделал с классом UploadedFile.
Illuminate\Http\UploadedFile.php ~ этот файл поставляется с базой 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
);
}
Используя Intervention
, я изменил размер изображения, которое хранится в папке/tmp/при загрузке файлов, а затем я сохранил его в том же месте. Теперь все, что я делаю после этого, создаю экземпляр UploadedFile, чтобы я мог продолжать использовать методы Laravel на request()->file('image')
. Надеюсь, это поможет.
Ответ 4
Вы можете попробовать использовать кодировку base64. У Symfony есть приятные вещи для этого.
Ваш код будет выглядеть следующим образом:
$base64Content = $request->request->get('base64Content'); // this is your post data
$yourFile = new UploadedBase64EncodedFile(new Base64EncodedFile($base64Content)); // this is an instance of UploadedFile
Надеюсь, это поможет!