Validar un base64 decodificado imagen en laravel

Estoy tratando de obtener una imagen a partir de una solicitud PUT para actualizar un usuario de la imagen(mediante cartero), y hacerla pasar a través de una validación en Laravel 5.2, para hacer la llamada en el cartero usar la siguiente url:

http://localhost:8000/api/v1/users?_method=PUT

y enviar la imagen de la cadena en el cuerpo, utilizando un json como este:

{
    "picture" : "data:image/png;base64,this-is-the-base64-encode-string"
}

En el controlador de probar un montón de diferentes maneras para decodificar la imagen y tratar de pasar la validación:

  1. Primero probé esto:

    $data = request->input('picture');
    $data = str_replace('data:image/png;base64,', '', $data);
    $data = str_replace(' ', '+', $data);
    $image = base64_decode($data);
    $file = app_path() . uniqid() . '.png';
    $success = file_put_contents($file, $image);
  2. Luego he intentado esto:

    list($type, $data) = explode(';', $data);
    list(, $data) = explode(',', $data);
    $data = base64_decode($data);
    $typeFile = explode(':', $type);
    $extension = explode('/', $typeFile[1]);
    $ext = $extension[1];
    Storage::put(public_path() . '/prueba.' . $ext, $data);
    $contents = Storage::get(base_path() . '/public/prueba.png');
  3. Intente utilizar la intervención de la imagen de la biblioteca (http://image.intervention.io/) y no pasa:

    $image = Image::make($data);
    $image->save(app_path() . 'test2.png');
    $image = Image::make(app_path() . 'test1.png');

Esta es la validación en el controlador:

    $data = [
        'picture' => $image,
        'first_name' => $request->input('first_name'),
        'last_name' => $request->input('last_name')
    ];

    $validator = Validator::make($data, User::rulesForUpdate());
    if ($validator->fails()) {
        return $this->respondFailedParametersValidation('Parameters failed validation for a user picture');
    } 

esta es la validación en el Usuario-modelo:

public static function rulesForUpdate() {
    return [
        'first_name' => 'max:255',
        'last_name' => 'max:255',
        'picture' => 'image|max:5000|mimes:jpeg,png'
    ];
}   
  • Yo no soy siguientes. ¿Cuál es el problema que estamos enfrentando?
  • Cant pasar la validación de una imagen creada a partir de una cadena base64

3 Kommentare

  1. 8

    Puede ampliar la clase de Validador de Laravel.

    Laravel Doc

    Pero de todos modos probar este

    Validator::extend('is_png',function($attribute, $value, $params, $validator) {
        $image = base64_decode($value);
        $f = finfo_open();
        $result = finfo_buffer($f, $image, FILEINFO_MIME_TYPE);
        return $result == 'image/png';
    });

    No olvides las reglas:

    $rules = array(
       'image' => 'is_png'
    );
  2. 17

    Si usted está utilizando la Intervención de todos modos, a continuación, puede aprovechar para una costumbre de la regla de validación. Tengo una que se llama «imagen». Básicamente se asegura de que la entrada dada será capaz de convertir a una Intervención de la imagen. Base64 datos de la imagen de las cadenas de pasar. Una cadena de «foo» no.

    Validator::extend('imageable', function ($attribute, $value, $params, $validator) {
        try {
            ImageManagerStatic::make($value);
            return true;
        } catch (\Exception $e) {
            return false;
        }
    });

    Esto, obviamente, sólo verifica que la entrada es capaz de convertir a una imagen. Sin embargo, se debe mostrar como un caso de uso cómo puede aprovechar la Intervención y de cualquiera de sus métodos para crear una regla personalizada.

    • He añadido el código en el boot método de la AppServiceProvider. Pero la cadena base64 no pasa la validación. Me estoy perdiendo algo? Cuando la extensión se define?
    • Pongo la mía en el boot método así. Usted debe tener algo mal.
    • Esto realmente me ayudó en mi aplicación actual, un millón de gracias!!
  3. 0

    dentro de extender la función de agregar este

    $res= mime_content_type($value);
    if ($res == 'image/png' || $res == 'image/jpeg') {
        return $res;
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea