最近接手一个项目,需要上传对应的奖项,以及佐证材料

也就是。。一个字符串,对应一张图片、需要多组字符串对应多组图片

其实这都好处理,关键就是,图片要如何上传给后端??

有一说一,光效果我就做了好久,图片效果代码我就不上传了分享了,我这边分享一下相关的测试代码,主要是分享一下如何上传图片给后端的方式


以下是VUE的一个组件,可以直接通过这个组件进行测试,即可成功。

这里强调一下,后端使用的数据传输方式是通过 multiple="multiple" 的方式进行传输的

<template>
    <form id="form1" action="/" method="post" enctype="multipart/form-data" class="input-file">
        <div>
            <input type="text" id="avatval" placeholder="请选择文件···" readonly="readonly" style="vertical-align: middle;"
                value="111" @click="uppic" />
            <!-- <label for="profile_pic" id="avatval">上传</label> -->
            <input multiple="multiple" type="file" id="profile_pic" name="profile_pic" accept=".jpg,.jpeg,.png"
                @change="filechange">
        </div>
        <div>
            <button type="button" id="btn" @click="meg()">提交</button>
        </div>
    </form>
</template>

<script>
import axios from 'axios';
import eventBus from '@/util/eventbus.js'
export default {
    namne: 'mytry',
    methods: {
        meg() {
            console.log(document.getElementById('profile_pic').files)

            let ava = document.getElementById('avatval');

            let pro = document.getElementById('profile_pic')
            console.log(pro.files)
            // console.log(pro.files[0].lastModified)
            ava.innerHTML = pro.files[0].name


            let mydata = new FormData()
            mydata.append('file',pro.files[0])
            axios.post('http://localhost:8081/testApi/test',mydata).then(res=>{
                console.log(res)
            })
        },
        uppic() {
            // 执行 id 为profile_pic 的点击事件方法
            let pro = document.getElementById('profile_pic')
            pro.click();



        },
        filechange() {

            let ava = document.getElementById('avatval');

            let pro = document.getElementById('profile_pic')
            // console.log(pro.files)
            console.log(pro.files[0])
            ava.value = pro.files[0].name
            // console.log(pro.files[0].name)
            // console.log(ava.value)
            eventBus.emit('eventFrom',pro.files[0])

        }
    },
    created(){
        console.log("mytry 组件")
    }
}
</script>

<style>
/* 隐藏原有的样式 */
input[type='file'] {
    border: 0px;
    display: none;
}

.input-file {
    margin: 2px 3px;
}

#avatval {
    padding: 3px 6px;
    padding-left: 10px;
    border: 1px solid #E7EAEC;
    width: 200px;
    height: 25px;
    line-height: 25px;
    border-left: 3px solid #3FB7EB;
    background: #FAFAFB;
    border-radius: 5px;
}
</style>

说一下这边注意的地方吧,

java vue前端预览邮件发送图片 前端上传图片到后端vue_javascript

 这三个分别是上传的格式,input的type上传文件类型 以及文件接受的内容

java vue前端预览邮件发送图片 前端上传图片到后端vue_java vue前端预览邮件发送图片_02

 需要注意的是,如果需要上传多个图片,其实可以通过

java vue前端预览邮件发送图片 前端上传图片到后端vue_javascript_03

创建一个循环,自定义的获取元素,这边定义为pro 好了,pro.files[0] 这边记得就算是保存在data(){}数据里面,也一样要带下标,不然后端会无法接受,以及当存在多个图片元素需要上传的时候,可以通过for循环,或者其他的循环进行遍历添加到表单当中。

或许有人会问了,这样不会把之前添加的覆盖掉吗,3个最后只剩1个?

程序的回答是,不会的。具体缘由,可以自行查阅以及尝试。因为我也不是很清楚。。。

这里展示一下console.log(pro.files)的样式

java vue前端预览邮件发送图片 前端上传图片到后端vue_java vue前端预览邮件发送图片_04

以及接口数据传输成功的样式

 

java vue前端预览邮件发送图片 前端上传图片到后端vue_javascript_05

java vue前端预览邮件发送图片 前端上传图片到后端vue_java vue前端预览邮件发送图片_06

 

java vue前端预览邮件发送图片 前端上传图片到后端vue_javascript_07

multipartFileList 是我传输的文件


 

 

重点就是这么多,最需要注意的就是 pro.files  这边, 以及数据传输都要以 pro.files[0] 带明确的下标进行。

 

这个文件传输,光样式就改了好多次,最后接口对接,也是第一次对接这种类型的接口,整了我3天吧,最后一天还是从下午3点一直对接到晚上7点才把测试接口对上。有一大部分原因是因为疫情,网上打字交流太慢了

哎,又是掉头发的一天,不过好在,将这个问题解决了