programing

폼 없이 vuej 및 larabel을 사용하여 파일 업로드

kingscode 2022. 9. 27. 21:29
반응형

폼 없이 vuej 및 larabel을 사용하여 파일 업로드

vue.js 2.1과 Larabel 5.4를 사용하여 폼 없이 컴포넌트에서 파일을 업로드하고 있습니다.

문제:서버측에서 이 스테이트먼트는return $request->file('my_file');null을 반환합니다.왜요?

vue 구성 요소는 다음과 같습니다.

<template>
    <input id="my_file" type="file" @change="fileChanged($event)">
    <button v-if="my_file" @click="update">Upload</button>
</template>

<script>
export default {
    data () {
        return {
            my_file: null,
        }
    },

    methods: {
        fileChanged(e) {
            var files = e.target.files || e.dataTransfer.files;
            if (!files.length)
                return;
            this.createImage(files[0]);
        },

        createImage(file) {
            var image = new Image();
            var reader = new FileReader();
            var vm = this;

            reader.onload = (e) => {
                vm.my_file = e.target.result;
            };
            reader.readAsDataURL(file);
        },

        update() {
            axios.put('/api/update/', {
                my_file: this.my_file,
            })
            .then(response => {
                console.log(response.data);
            })
            .catch(error => {
                console.log(error);
            });
        }
    }
}
</script>

서버측에서는, 다음의 방법이 있습니다.

public function update(Request $request)
{
    return $request->file('my_file');

    // $request->file('my_file')->store();
}

제가 무엇을 빠뜨리고 있나요?기능을 사용할 수 있도록$request->file('my_file')->store();파일을 업로드하기 위해 Laravel이 제공한 것입니다.

편집 http 동사를 에서 변경했습니다.put로.post다음과 같이 합니다.

trySomeThing () {
    var data = new FormData();
    var file = this.$refs.fileInput.files[0];
    data.append('attachment_file', file);
    data.append('msg', 'hello');

    axios.post('/api/try', data)
        .then(response => {
            console.log(response.data)
        });
},

컨트롤러에는 다음과 같은 기능이 있습니다.

public function try(Request $request)
{
    if ($request->hasFile('my_file')) {
        $file = $request->file('my_file');
        //$file->getFilename();
        return var_dump($file);
    } else {
        return var_dump($_POST);
    }
}

요청 헤더에는 다음이 포함됩니다.

반환된 응답은 다음과 같습니다.

대답

먼저 파일 입력에 Vue 참조를 추가합니다.

<input id="my_file" type="file" @change="fileChanged($event)" ref="fileInput">

그럼 다음 업데이트update방법:

update() {
    var data = new FormData()
    var file = this.$refs.fileInput.files[0]
    data.append('my_file', file)
    axios.put('/api/update/', data)     
    .then(response => {
        console.log(response.data)
    })
    .catch(error => {
        console.log(error)
    });
}

라라벨 어플리케이션:

if ($request->hasFile('my_file')) {
   $file = $request->file('my_file');
   dd($file);
}

상세정보: Larabel 문서

뷰는 다음과 같아야 합니다.

<template>
<div class="row">
    <div class="col-md-12">
        <div class="col-md-2">
            <img :src="image" class="img-responsive">
        </div>
        <div class="col-md-8">
            <input type="file" v-on:change="onFileChange" class="form-control">
        </div>
        <div class="col-md-2">
            <button class="btn btn-success btn-block" @click="upload">Upload</button>
        </div>
       </div>
   </div>
</template>
<style scoped>
img{
    max-height: 36px;
}
</style>
<script>
    export default{
    data(){
        return {
            image: ''
        }
    },
    methods: {
        onFileChange(e) {
            let files = e.target.files || e.dataTransfer.files;
            if (!files.length)
                return;
            this.createImage(files[0]);
        },
        createImage(file) {
            let reader = new FileReader();
            let vm = this;
            reader.onload = (e) => {
                vm.image = e.target.result;
            };
            reader.readAsDataURL(file);
        },
        upload(){
            axios.post('/api/upload',{image: this.image}).then(response => {

            });
        }
    }
}
</script>

언급URL : https://stackoverflow.com/questions/45549821/upload-a-file-using-vuejs-and-laravel-without-a-form

반응형