Подтвердить что ты не робот

Вручную создавая Symfony UploadedFile

Я столкнулся с следующей проблемой и, похоже, не могу понять этого. Я написал конечную точку API, принимающую POST с двоичными данными (header: content-type: image/jpeg).

Я знаю, что могу прочитать исходную строку с file_get_content('php://input') или Laravel $request->getContent(). PHP также имеет функцию createimagefromstring($string), которая также, кажется, правильно читает строку.

Что бы я хотел сделать, это создать UploadedFile из этих необработанных данных, чтобы я мог справиться с уже написанными функциями.

Возможно ли это?

Заранее благодарю

4b9b3361

Ответ 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

Надеюсь, это поможет!