2015-07-18 3 views
1

Во-первых, поскольку английский язык не мой родной язык, пожалуйста, извините мои ошибки.VichUploaderBundle & Cropit - передать base64 в экземпляр файла

Я пытаюсь разработать свой первый проект через Symfony2. Однако я застрял в загрузке файлов. Поэтому я установил VichUploaderBundle, которые обеспечивают именно то, что мне нужно для управления: все виды загруженных медиа (в основном, изображения).

Зачем нужно загружать изображение? У меня есть пользователь в моем проекте, и они могут редактировать свой профиль. Итак, у меня есть профиль ProfilePicture, который должен управлять загрузкой, благодаря VichUploaderBundle. Он отлично работает, когда форма отправляется с помощью кнопки отправки или с помощью ajax.

Однако, чтобы улучшить опыт пользователя, я также добавил плагин jQuery (Cropit). Cropit дает base64 обрезанного изображения. Я отправляю все, используя ajax.

И знаю ... Я боюсь. Я искал всюду в Интернете, чтобы найти кого-то с началом идеи, я прочитал все документы, пытаясь найти другой способ сделать то, что я пытаюсь сделать.

Вот мой фактический «тест» Код:

$base64 = $request->request->get('base64'); 
preg_match('/data:([^;]*);base64,(.*)/', $base64, $matches); 
$data = base64_decode($matches[2]); 
$ui = uniqid().'.png'; 
$file = 'images/profile_pictures/'. $ui; 
file_put_contents($file, $data); 

$picture = new File($file); 

$profile->getPicture()->setImageFile($picture); 

Это позволит мне сохранить обрезанную фотографию в разыскиваемого каталоге. Однако, это не совсем то, что я хотел бы. Фактически, я просто пытаюсь найти способ преобразовать содержимое base64 в то, что было бы в $ profile-> getPicture() -> setImageFile(), если бы я только что отправил фотографию. Я расплывчата и извиняюсь. Это первый раз, когда я должен создать систему загрузки.

Я думал, что может быть способ избежать отправки base64. Но что мы можем сделать с такими данными? Можем ли мы использовать jQuery для его декодирования и преобразовать форму, чтобы отправить форму, как было бы, если бы я просто выбрал свою фотографию и хочу сохранить ее все?

Как вам это удается в вашем проекте? Есть ли какой-нибудь другой пакет лучше, чем этот? Я искал, без успеха. SonataMediaBundle кажется большим для моей потребности, и я не нашел способа сохранить свою обрезанную картинку вместе с ней.

Я нашел человека, который хотел управлять им на Git VichUploaderBundle. Однако его вопрос был закрыт до того, как был получен лучший ответ ... https://github.com/dustin10/VichUploaderBundle/issues/223

Заранее вам за помощь!

ответ

2

Проблема была закрыта, потому что она не вписывается в область сложения. VichUploaderBundle в основном отображает объекты UploadedFile объектам через формы, вот и все.

Ключевые слова для вашей проблемы будучи "UploadedFile" и„формы“.

Если вы должны отправить файл в кодировке base64 строки, необработанные байты, ... то вы должны преобразовать его в UploadedFile для того, чтобы заставить его работать с VichUploaderBundle. Я предполагаю, что DataTransformer может сделать трюк. это может декодировать строку в кодировке base64 и хранить его во временный файл, который может быть использован для build an UploadedFile object.

0

Я хотел бы чтобы поделиться моим текущим решением.

Мне нужно для загрузки изображений, закодированных в base64. Эти изображения генерируются с использованием библиотеки cropper.js и отправляются на конкретную конечную точку.

Я использовал DataTransformerInterface для создания объекта UploadedFile, например, предложенного K-Phoen.

Я хотел бы указать на некоторые отличия от канонического использования комплекта.

Используйте TextType вместо VichFileType (в противном случае проверка не удастся). Используйте трансформатор данных для декодирования изображения, чтобы сохранить его временно (спасибо за подсказку K-Phoen).

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('file', TextType::class, ['required' => true]); 
    $builder->get('file')->addModelTransformer(new FileToBase64Transformer()); 
} 

Мой FileToBase64Trasformer:

class FileToBase64Transformer implements DataTransformerInterface 
{ 
    public function transform($value) 
    { 
    } 

    public function reverseTransform($value) 
    { 
     $tmpFilePath = tempnam(sys_get_temp_dir(), 'allegato_'); 

     $tmp = fopen($tmpFilePath, 'wb+'); 

     $matches = []; 
     preg_match('/^data:([\w-]+\/[\w-]+);base64,(.+)$/', $value, $matches); 

     $size = fwrite($tmp, base64_decode($matches[2])); 

     fclose($tmp); 

     return new UploadedFile($tmpFilePath, 'originalName', $matches[1], $size, 0, true); 
    } 
} 

Обратите внимание на параметры конструктора UploadedFile «s:

  1. 3-й параметр типа пантомимы файла
  2. 4-парам является кодом ошибки (0 означает отсутствие ошибок вообще)
  3. 5-й парам делает трюк. Внутренне UploadedFile вызовет функцию is_uploaded_file, которая потерпит неудачу (файл создается путем декодирования строки base64, не загружается), что вызывает неизвестную ошибку. Если вы понимаете и принимаете риск, установите этот параметр равным true, чтобы избежать.