在 vuejs 和 Laravel 中传递上传文件照片的值

Posted

技术标签:

【中文标题】在 vuejs 和 Laravel 中传递上传文件照片的值【英文标题】:pass the value of a uploaded file photo in vuejs and Laravel 【发布时间】:2021-06-18 01:31:20 【问题描述】:

我想上传我的照片并将值传递给 laravel。我有这个编辑个人资料,可以上传我的照片。现在我的问题是如何将照片的值传递给 axios。下面是我的代码

<template>
    <div class="card">
        <div class="card-header">Profile Form</div>
         <div class="card-body">
            <div class="container">
                 <div class="row">
                    <div class="col-sm">
                        <div v-show="updatePP" id="preview">
                            <img v-if="url" :src="url" />
                        </div>
                        <div v-show="pp" v-if="editProfile.profile_pic == NULL">
                             <img src="https://i.imgflip.com/4/d0tb7.jpg" />
                        </div>
                        <div v-else>
                             asasasas
                        </div>
                    </div>
                    <div class="col-sm">
                        <form @submit.prevent="formSubmit" enctype="multipart/form-data">
                        <div class="form-group">
                            <div class="form-row" >
                                <div class="col-lg-12">
                                    <label>First Name:</label>
                                    <br>
                                    <input type="text" id="name" name="name" class="form-control" v-model="editProfile.name" />  
                                </div>
                                <div class="col-lg-12">
                                    <label>Last Name:</label>
                                    <br>
                                   <input type="text" id="lastName" name="lastName" class="form-control" v-model="editProfile.last_name" />
                                </div>
                                <div class="col-lg-12">
                                    <label>Address:</label>
                                    <br>
                                    <input type="text" id="address" name="address" class="form-control" v-model="editProfile.address" />
                                </div>
                                <div class="col-lg-12">
                                    <label>Upload Profile:</label>
                                    <br>
                                    <input type="file" id="photo" name="photo" @change="onFileChange" />
                                </div>
                               
                                <div class="col-lg-12">
                                    <br>
                                    <br>
                                    
                                  
                                    <button type="submit" class="btn btn-success btn-lg">Update</button>
                                </div>                   
                                
                            </div>
                        </div>
                        </form>
                       
                    </div>
                   
                </div>
            </div>
        </div>
    </div>
</template>
<script>
export default 
    data()
        return
           
            
            editProfile:
                userId: this.$userId,
            ,
            
            url: null,
            pp: true,
            updatePP: false,
            userId:this.$userId,
        
    ,

    mounted()
        const url = window.location.href;
        const id = url.split("/").slice(4)[0];
        this.getEditProfile(id);
    ,
    methods:
        onFileChange(e)
            const file = e.target.files[0];
            this.url = URL.createObjectURL(file);
            this.editProfile.photo = file;

            this.updatePP = true;
            this.pp = false;
    
        ,
        
        formSubmit()
            const ids = this.userId;      
           
            let currentObj = this;

            alert(this.editProfile.name);
            alert(this.editProfile.last_name);
            alert(this.editProfile.address);
            alert(this.editProfile.photo.name);

            let formData = new FormData();
            formData.append('photo', this.editProfile.photo.name);
            formData.append('name', this.editProfile.name);
            formData.append('lastName', this.editProfile.last_name);
            formData.append('address', this.editProfile.address);
            console.log(formData.values);
            axios.put(`/api/profile/$ids/update`, this.editProfile).then(response=>
                console.log(response.data);
                currentObj.success = response.data.success;
               

            ).catch(error=>
                console.log(error);
                currentObj.output = error;
            );
        ,

        updateProfile(id)
           
        ,
        
        getEditProfile(id)
           axios.get(`/api/profile/$id/edit`).then(response=>
                this.editProfile = response.data;
                console.log(response.data);
           );
        
    

</script>

<style scoped>
    #preview 
        display: flex;
        justify-content: center;
        align-items: center;
    

    #preview img 
        max-width: 250px;
        max-height: 250px;
    
</style>

我正在使用FormData(),我希望将数据传递给 axios。 非常感谢任何帮助。 TIA

【问题讨论】:

【参考方案1】:

您需要包含文件的输入字段并提交您正在创建的FormData 对象。

将您的 submit() 函数更改为类似的内容,html 表单不支持 PUTPATCHDELETE 操作。因此,在定义从 HTML 表单调用的 PUTPATCHDELETE 路由时,您需要对其进行扩展,并在表单中添加一个隐藏的 _method 字段(https://laravel.com/docs/8.x/routing#form-method-spoofing):

formSubmit()
            const ids = this.userId;      
           
            let currentObj = this;

            alert(this.editProfile.name);
            alert(this.editProfile.last_name);
            alert(this.editProfile.address);
            alert(this.editProfile.photo.name);

            let formData = new FormData();
            formData.append('photo', this.editProfile.photo.name);
            formData.append('name', this.editProfile.name);
            formData.append('lastName', this.editProfile.last_name);
            formData.append('address', this.editProfile.address);
            formData.append('file', document.getElementById('fileInputId').files[0]);
            console.log(formData.values);
            axios.post(`/api/profile/$ids/update`, formData).then(response=>
                console.log(response.data);
                currentObj.success = response.data.success;
               

            ).catch(error=>
                console.log(error);
                currentObj.output = error;
            );
        ,

然后要使用put,请将其添加到您的表单中:&lt;input type="hidden" name="_method" value="PUT"&gt;

在您的控制器中,您可以通过以下方式检查文件是否成功通过:

public function controllerMethod(Request $request)

    if($request->hasFile('file')) 
      dd('Success - there is a file.');
   

    dd('Unsuccessful - there is no file');

这个问题可能会有所帮助:How to send a file via Axios to Laravel

【讨论】:

你能更新你的代码吗?当我将 formData 传递给 axios 时,它似乎不起作用 如何将 formData 传递给我的 Laravel 嗨,为什么我的formData在数据通过tru laravel时是空的 您是否更新了您的axios.put() 以包含formData 对象,而不是您之前使用的this.editProfile 是的,在注释 axios.put(/api/profile/$ids/update, formData) 中使用您的代码

以上是关于在 vuejs 和 Laravel 中传递上传文件照片的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 vuejs 和 laravel 上传文件,无需表单

视频上传和流式传输(使用 Laravel VueJs 上传和显示所有类型的文件视频、图像、文档等)

使用 vuejs 和 laravel 在 URL 中传递参数

形成 laravel 和 vueJS

VueJS Laravel - 使用 Axios 上传图片发布错误:“给定数据无效”

使用 fetch API vuejs 上传文件返回 419 未知状态