龙空技术网

我学会 drf + vue + axios上传美女了

轻编程 181

前言:

此时小伙伴们对“php返回数据给前端”大致比较关切,各位老铁们都需要剖析一些“php返回数据给前端”的相关内容。那么小编也在网络上收集了一些对于“php返回数据给前端””的相关资讯,希望同学们能喜欢,小伙伴们快快来学习一下吧!

好家伙,自学前后端分离开发一步一个坑,填完后端填前端,当真正扎入现代前端的开发过程中,才发现现在的前端程序员工资高那是应该的,在之前我们后端全干前端的时候只记得,前端就是个切图写个HTML,甚至连交互都不写,只是把静态页面给后端,后端再去处理,这就是PHP这门语言在web领域盛行这些年的重要原因,快,节省成本,一个后端全干,全包,现在不行了,初级的后端PHP甚至已经不如前端吃得开了,说了这么多,还是想说现在的前端不能再小瞧了,有些难,还有些磨人!

记一次前端axios+vue上传图片的坑

后端写个上传图片的接口可不是很简单,只需要让这个字段限制为图片格式,后台做个保存的逻辑就完事了,前端处理还要牵扯到请求头,数据格式的处理等等问题,按照老传统把图片按照字符串往接口put发现返回的全是400错误,直到我知道了前端的FormData方法!

FormData是个什么鬼?

经过多方搜索调查了解,这个神奇的东西是XMLHttpRequest Level 2 新增的一个对象,于2008年2月提出,可以利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件,可以把所有表单元素的name与value组成一个queryString,提交到后台。

划重点: 可以把所有表单元素的name与value组成一个queryString,提交到后台。这不就是后端所谓的转换数据格式,按格式提交呗,前后端分离肯定是异步提交,这个就可以很好地去解决这个问题!

使用也很soeasy 只需要把 form 表单作为参数传入 FormData 构造函数即可!

在vue和axios的配合下实战一波

 <!--     *.vue组件中的上传组件      我这里使用的是buefy的vue组件 -->  <form  method="post" enctype="multipart/form-data">     <b-field class="file is-primary" :class="{'has-name': !!file}">         <b-upload v-model="file" class="file-label" @input="getModifyAvatar()">             <span class="file-cta">                 <b-icon class="file-icon" icon="upload"></b-icon>                 <span class="file-label">Click to upload</span>             </span>             <span class="file-name" v-if="file">                 {{ file.name }}             </span>                            </b-upload>    </b-field> </form>  <script>     export default {         data(){             return {                 userInfo: '',   // 通过一个get请求把用户相关信息赋值给它                 file: null,             }         },         methods: {             // 修改头像             getModifyAvatar(){                 const formData = new FormData();                 // 构造formData数据                 formData.append('avatar', this.file)                 // 提交put请求                 getModifyInfo(formData).then(res => {                     this.userInfo.avatar = res.data.avatar                 })             },         }     } </script>
 // api.js // 这是我封装的全局请求方法 import { request } from '../network/request'  // 修改用户头像 export const getModifyInfo = (params) => {     return request({         url: 've_register/1/',         method: 'put',         headers: { 'Content-Type': 'multipart/form-data' },         data: params     }) }

看以上代码,注意发送请求的时候一定要设置请求头header,如上所示,html表单form中也需要设置下enctype="multipart/form-data" 否则也是不行的!

通过上面的例子我们目前只用到了FormData的append()方法,网上大部分关于 FormData 介绍的文章都只提到了append()方法,那么FormData 对象到底有些什么方法呢?其实我们console 一下就知道了:

console 之后我们有重大的发现,FormData 对象竟然有这么多方法,所以还是自己测试才能发现真相,下面就对这些方法一一进行讲解:

append()

append()方法用于向 FormData 对象中添加键值对:

 fd.append('key1',"value1"); fd.append('key2',"value2");

fd是 FormData 对象,可以新建的空的对象,也可以是已经包含 form 表单或其他键值对。

set()

设置对应的键 key 对应的值 value(s)

 fd.set('key1',"value1"); fd.set('key2',"value2");

append() 方法有点类似,这两者的区别就是,当指定的 key 值存在时,append()方法是将新增的添加的所有的键值对最后,而set()方法将会覆盖前面的设置的键值对。还是通过实例来对比,我们在前面的 form 的基础上 append() 或 set() 新的键值对:

 fd.append('name',"will");

以上就是 append() 和 set() 的区别。如果设置的key值不存在,那么两者的效果是一样的。

delete()

接收一个参数,表示你要删除的 key 值的名字,如果有多个相同 key 值,会一并删除:

 fd.append('name','will'); fd.delete('name');

form 中的 name 信息以及通过append() 新增的name 的信息都被删除了。

get() 和 getAll()

接收一个参数,表示需要查找的 key 的名称,返回第一个该 key 对应的 value 值。如果有多个相同的 key, 而且要返回所有的这个 key 对应的 value 值。

同样以上面的 form 表单为基础:

 fd.append('name','will'); console.log(fd.get('name')); // sean
 fd.append('name','will'); console.log(fd.getAll('name')); // ["sean", "will"]
has()

该方法也接收一个参数,同样是 key 的名称,返回一个Boolean 值, 用来判断FormData 对象是否含有该 key。以上面的form为例:

 console.log(fd.has('name')); // true console.log(fd.has('Name')); // false

其他几个就不介绍了,大家感兴趣的自己去验证下,写一遍吗,敲一遍,比看任何文章要来得实在哟!

标签: #php返回数据给前端 #如何用axios发送数据给后端 #vue图片上传到接口