Как загрузить изображение из VueJS в Symfony с помощью Axios? - PullRequest
0 голосов
/ 28 декабря 2018

В моем проекте с Symfony 4 без проблем установлен компонент VueJS, но в данный момент я хочу загрузить изображение.Я следую этой ссылке из Laravel: Как загрузить изображение из VueJS в Laravel с помощью Axios ?

Я попадаю в контроллер, но здесь значение в base 64 не достигает только сообщения консоли.

Код:

//CargaFoto.vue
<template>
    <div class="hello">
        <h1>{{ msg }}</h1>
        <input type="file" name="image" @change="getImage" accept="image/*">
        <button @click="updateAvatar">Subir Imagen</button>
        </div>
    </div>
</template>

<script>
    import axios from 'axios'

    export default {
        name: "CargaFoto",
        data() {
            return {
                msg: "Cargar Imagen de Perfil",
                imagen: null
           };
        },
        methods: {
            getImage(event){
            //Asignamos la imagen a  nuestra data
            this.imagen = event.target.files[0];
        },
        updateAvatar(){
            //Creamos el formData
            var data = new  FormData();
            data.append('avatar', this.imagen);
            data.append('_method', 'POST');
            //Enviamos la petición
            axios.post('/usuario/jsonimagen',data)
                .then(response => {
                    console.log(res)
                })
        }
</script>

А это код контроллера:

/**
 * @return JsonResponse
 * @Route("/jsonimagen", name="jsonimagen", methods="POST")
 */
public function jsonimagen(Request $request):JsonResponse
{

    $data= $request->get("data");
    return $this->json($data);
}

Ответ null Сомнение в том, как я загружаю изображениена локальный сервер.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

На основе ссылки комментария, обозначенного Fran Я мог видеть, что заголовок отсутствовал, а затем собирать данные в Symfony по тому же маршруту, который уже был определен.

Файл шаблона был таким:

//CargaFoto.vue
<template>
    <div class="hello">
        <h1>{{ msg }}</h1>
      <div class="container">
            <div class="large-12 medium-12 small-12 cell">
                <label>File
                    <input type="file" id="file" ref="file" v-on:change="handleFileUpload()"/>
                </label>
                <button v-on:click="submitFile()">Submit</button>
            </div>
        </div>

        </div>
    </div>
</template>

<script>
    import axios from 'axios'

    export default {
        name: "CargaFoto",
        data() {
            return {
                msg: "Cargar Imagen de Perfil",
                file: ''
                //selectedFile: null
            };
        },
        methods: {
            submitFile(){
                /*
                        Initialize the form data
                    */
                let formData = new FormData();

                /*
                    Add the form data we need to submit
                */
                formData.append('file', this.file);

                /*
                  Make the request to the POST /single-file URL
                */
                axios.post( '/usuario/jsonimagen',
                    formData,
                    {
                        headers: {
                            'Content-Type': 'multipart/form-data'
                        }
                    }
                ).then(function(){
                    console.log('SUCCESS!!');
                })
                    .catch(function(){
                        console.log('FAILURE!!');
                    });
            },

            /*
              Handles a change on the file upload
            */
            handleFileUpload(){
                this.file = this.$refs.file.files[0];
            }
        }
    };
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style>
    #fileInput {
        display: none;
    }
    h1,
    h2 {
        font-weight: normal;
    }
    ul {
        list-style-type: none;
        padding: 0;
    }
    li {
        display: inline-block;
        margin: 0 10px;
    }
    a {
        color: #42b983;
    }
    .my-8 {
        margin-top: 4rem;
        margin-bottom: 4rem;
    }
</style>

В файле, где запрашиваются данные, контроллер:

//src/UsuarioController.php
/**
 * @return JsonResponse
 * @Route("/jsonimagen", name="jsonimagen", methods="POST")

 */
public function jsonimagen(Request $request):JsonResponse
{
    $usuario = $this->getUser();
    $data = $request->files->get('file');
    $fileName = $usuario.'.'.$data->guessExtension();
    // moves the file to the directory where usuarios are stored
    $data->move(
        $this->getParameter('usuarios_directorio'),
        $fileName
    );
    echo $data; exit;
    return $this->json($data);
}

Также настройте путь, где изображениябудет загружен в файл

//services.yaml
parameters:
    locale: 'en'
    usuarios_directorio: '%kernel.project_dir%/public/uploads/usuarios'

Здесь вы можете увидеть изображение, загруженное в этот снимок.

enter image description here

0 голосов
/ 28 декабря 2018

Вы отправляете содержимое файла как переменную avatar, почему вы пытаетесь получить запрос data тогда?

Правильная форма будет:

$avatar = $request->file('avatar');

Кроме того, выможете пропустить добавление _method: 'POST' к отправленным данным, как вы уже делаете axios.post.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...