Vue使用axios图片上传遇到的问题

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");

有两个key为name的键值对:

以上就是 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

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

如果以上文章对您有帮助,请给我们的开源项目点点star: github.crmeb.net/u/xingfu不胜感激!

以上就是Vue使用axios图片上传遇到的问题的详细内容,更多关于Vue使用axios图片上传的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于vue+axios+lrz.js微信端图片压缩上传方法

    业务场景 微信端项目是基于Vux + Axios构建的,关于图片上传的业务场景有以下几点需求: 1.单张图片上传(如个人头像,实名认证等业务) 2.多张图片上传(如某类工单记录) 3.上传图片时期望能按指定尺寸压缩处理 4.上传图片可以从相册中选择或者直接拍照 遇到的坑 采用微信JSSDK上传图片 在之前开发的项目中(mui + jquery),有使用过微信JSSDK的接口上传图片,本想应该能快速迁移至此项目.事实证明编程没有简单的事: 1.按指定尺寸压缩图片 JSSDK提供的接口wx.choo

  • Vue axios 中提交表单数据(含上传文件)

    我们经常使用表单来上传数据,以及上传文件,那么怎么在表单提交成功的时候接受服务器的响应,并作出相应操作. 当然使用一般jQuery上传对象的格式也是可以的,如果使用传统的表单上传呢? <!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport

  • vue中使用axios post上传头像/图片并实时显示到页面的方法

    在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码: <div id="myPhoto" v-show="personalPhoto"> <div class="viewPhoto"> <img src="" alt="" id="portrait"style=&q

  • Vue+thinkphp5.1+axios实现文件上传

    本文实例为大家分享了使用thinkphp5.1 + Vue+axios+实现文件上传,供大家参考,具体内容如下 前言 使用thinkphp5.1 + Vue+axios+实现文件上传 一.页面代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>上传Demo</title> <style> .fileBtn{ width: 180p

  • vue项目中使用axios上传图片等文件操作

    axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 自动转换JSON数据 客户端支持防止 CSRF/XSRF 首先安装axios: 1.利用npm安装npm install axios –save 2.利用bower安装bower install axios

  • vue+element-ui+axios实现图片上传

    本文实例为大家分享了vue+element-ui+axios实现图片上传的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples<

  • vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)

    vue-cli+axios实现附件上传下载记录: 上传: 这里用formData格式传递参数:请求成功后后台返回上传文件的对应信息. 重点是下载: ############## downloadfile(res) { var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //applicati

  • vue使用axios实现文件上传进度的实时更新详解

    axios 简介 axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,它本身具有以下特征: 从浏览器中创建 XMLHttpRequest 从 node.js 发出 http 请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 取消请求 自动转换JSON数据 客户端支持防止 CSRF/XSRF 引入方式: $ npm install axios //使用淘宝源 $ cnpm install axios //或者使用cdn: <script s

  • vue实现axios图片上传功能

    vue中实现图片上传,我这里使用的是FormData通过axios向后台发送请求,从而实现图片的上传. 在发起请求的axios中一般用qs进行序列化,但是序列化之后,FormData就传送失败,所以要区别传送的数据类型. 经过多次摸索总结了以下经验,以供参考. 首先创建一个文件夹services ,里面有两个文件 index.js 和 api.js. 我们的qs序列化和数据拦截写在index.js中 import axios from "axios"; import config fr

  • vue使用axios上传文件(FormData)的方法

    在此主要介绍 如何使用 formData 对象上传单文件和多文件,FormData 就是 XMLHttpRequest Level 2 新增的一个对象,利用它来提交表单.模拟表单提交,当然最大的优势就是可以上传二进制文件. 过多介绍不说,过多的煽情语句不说,直接来来干活,希望对广大博友有所帮助.也希望各位大神不吝赐教 1.前台上传文件的表单和响应函数 <!--文件上传表单--> <form> <input type="text" value="&

随机推荐