Vue 表单提交 -- 文件上传

注意:

1.必须是post请求,需要设置headers: {'Content-Type':'multipart/form-data'},在这个前提下才能文件上传。
2.你的文件上传<input type="file" @change="getFile($event)"/>
外层要有<form enctype="multipart/form-data" name="fileinfo" id="myForm"></form>
3.<input type="file" @change="getFile($event)"/>的change方法很重要,要记得加上,是用来获取选择的文件的信息数据。
4.参数传递要这么处理:把接口的所有参数通过这个方式加到params里。这样在控制台看到的参数格式才是对的,如下图。
这里遇到一个坑,就是不这么处理,而是简单的formData = params这么传递,auth_user_file看到是{},虽然选择文件时在控制台能看到信息,但是作为接口参数传递时就为{};

        let formData = new FormData();
        formData.append('auth_user_file', auth_user_file);
        formData.append('op_type', op_type);
        formData.append('modify_users', JSON.stringify(modify_users));
        formData.append('dst_level', dst_level);
        formData.append('comment', comment);
        formData.append('game_id', 2577);
        formData.append('src_type', 0);
        params = formData;
表单参数.png

5.因为我们这个项目的文件上传项不是必填,也可以选择手动输入,如果没有选择文件,建议这么处理。
-- headers: { 'Content-Type': 'application/x-www-form-urlencoded'}
-- params = Qs.stringify(params);//处理参数参数作为对象传递就可以了,但是要用vue的qs进行处理。参数格式在控制台看到是这样的


image.png

关于文件上传实现的源码贴在下面,供参考
PermissionSettings.vue

<template>
  <div class="set-box">
    <form enctype="multipart/form-data" name="fileinfo" id="myForm">
    <div class="power-level widths">
      <span>权限级别</span>
      <!--权限级别的文案是: 管理者权限,审核权限 - C级,审核权限 - B级,,审核权限 - A级-->
      <!--操作状态的文案是: 授予权限,取消权限-->
      <select name="dst_level" id="selectLevel" v-model="formData.dst_level">
        <!--<option selected="selected" disabled="disabled"  style='display: none' value=''></option>-->
        <option value="null" disabled selected hidden>请选择权限级别</option>
        <option value="0" v-if="Number(admin_level) === 1">普通管理者</option>
        <option value="1">A级</option>
        <option value="2">B级</option>
        <option value="3">C级</option>
      </select>
    </div>
    <div class="power-state widths">
      <span>权限操作状态</span>
      <select name="op_type" id="selectState" v-model="formData.op_type">
        <option value="null" disabled selected hidden>请选择授权/取消</option>
        <option value="1" v-if="Number(admin_level) === 1">授予权限</option>
        <option value="2">取消权限</option>
      </select>
    </div>
    <div class="roll widths">
      <span>名单</span>
      <div class="roll-font">
        <!--<p><span></span></p>-->
        <textarea value=""
                  name="modify_users"
                  class="clearfix"
                  id="roll"
                  placeholder="名单类型:QQ号或微信号
请输入名单,每行仅限一个QQ账号
或者微信账号,请以空格键隔开"
                  v-model="formData.modify_users"
        ></textarea>
        <div class="roll-list">
            <input type="file" @change="getFile($event)"/>
        </div>

        <div class="roll-model">
          <div>名单文件模板下载:
            <a download="https://courtreport.gamesafe.qq.com/static/report_judge/admin/static/user_template.txt">
              管理平台授权模板
            </a>
          </div>
        </div>
      </div>
    </div>

    <div class="desc widths">
      <span>授权描述</span>
      <div class="roll-font">
        <textarea value=""
                  class="clearfix"
                  v-model="formData.comment"
                  name="comment"
        ></textarea>
        <button class="btn-submit"
                type="button"
                @click="checkForm()"
        >提交处理</button>
      </div>
    </div>
    </form>
    <my-dialog :form-err="formErr" :set-data-txt="setDataTxt">{{setDataTxt}}</my-dialog>
  </div>
</template>

<script>
    import server from "../apis/servers"
    import MyDialog from "./MyDialog";
    export default {
      name: "PermissionSettings",
      components: {MyDialog},
      data(){
        return{
          formData:{
            dst_level: null,
            op_type: null,
            comment: null,
            modify_users: [],
            auth_user_file: null,
          },
          formErr: null,
          setDataTxt: null,
        }
      },
      computed:{
        admin_level(){
          return sessionStorage.getItem("admin_level");
        }
      },
      mounted(){

      },
      methods:{
        setting_modify_user_auth: server.setting_modify_user_auth,
        checkForm(){
          if(this.formData.dst_level === null){
            this.formErr = '权限级别';
            this.$store.commit('changeDialog','settingFormErr');
            return;
          }else if(this.formData.op_type === null){
            this.formErr = '授权/取消';
            this.$store.commit('changeDialog','settingFormErr');
            return;
          }else if(this.formData.comment === null){
            this.formErr = '授权描述';
            this.$store.commit('changeDialog','settingFormErr');
            return;
          }else if(this.formData.modify_users.length === 0 && this.formData.auth_user_file === null){
            this.formErr = '输入名单/上传名单';
            this.$store.commit('changeDialog','settingFormErr');
            return;
          }else{
            this.setting_modify_user_auth(
              this.formData.op_type,
              this.formData.modify_users,
              this.formData.comment,
              this.formData.dst_level,
              this.formData.auth_user_file,
              'permission'
            );
          }
        },
        getFile(event) {
          this.formData.auth_user_file = event.target.files[0];
        },
        formReset(){
          this.formData = {
            dst_level: null,
            op_type: null,
            comment: null,
            modify_users: [],
            auth_user_file: null,
          }
        }
      }

    }
</script>

<style scoped>

</style>

servers.js

//修改玩家权限
  setting_modify_user_auth(op_type,modify_users,comment,dst_level,auth_user_file){
    let url = '/cgi-bin/report_judge/qq/modify_user_auth';
    let tableParams = {
      game_id: 2577,//游戏id, 取0表示全量游戏
      src_type: 0,
      op_type: op_type,//1:授权,2:取消
      modify_users: modify_users,//用户列表, “名单”输入框中的数据。授予权限的时候,需要以:分割的qq与open_id组合,如果是取消权限只需给出uin列表
      dst_level: dst_level,//设置的目标等级,0:普通管理者权限,1:A类审核权限, 2:B类审核权限, 3: C类审核权限
      comment: comment,//权限变更时的评论语,没有则为空
    };
    let config = null;
    let params = null;
    //处理文件上传的参数
      if(auth_user_file !== null){//auth_user_file如果上传文件了,就不手动输入名单了
        let formData = new FormData();
        formData.append('auth_user_file', auth_user_file);
        formData.append('op_type', op_type);
        formData.append('modify_users', JSON.stringify(modify_users));
        formData.append('dst_level', dst_level);
        formData.append('comment', comment);
        formData.append('game_id', 2577);
        formData.append('src_type', 0);
        params = formData;
        config = {
          headers: {'Content-Type':'multipart/form-data'}
        }
      }else{
        params = tableParams;
        //处理modify_users参数
        if(params.modify_users.length === 0){
          return;
        };
        let arr = [];
        arr.push(params.modify_users);
        params.modify_users = params.modify_users.indexOf(" ") > -1 ? params.modify_users.split(" ") : arr;
        params.modify_users = JSON.stringify(params.modify_users);
        params = Qs.stringify(params);//处理参数
        config = {
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }
      }
      this.$axios.post(url, params,config)
      .then(response => {
        let dst_level_txt = Number(dst_level) === 0 ? "管理权限" : "审判权限";
        let op_type_txt = Number(op_type) === 1 ? "授权" : "取消";
        if (response.data.ret === 0) {
          this.formReset();
          if(op_type === 1){
            this.setDataTxt = `${op_type_txt}成功 – “${dst_level_txt}”${op_type_txt}成功,请知会被授权人确认;`;
          }else{
            this.setDataTxt = `取消成功 – ”${dst_level_txt}“取消成功;`;
          };
        }else if (response.data.ret === 17) {
          this.$loginOut();
        }else{
          this.setDataTxt = `${op_type_txt}失败 – ”${dst_level_txt}“${op_type_txt}失败,请重新尝试;`;
        };
        this.$store.commit('changeDialog','setDataTxt');
      })
      .catch(error => {

      })
  },

$.ajax文件上传:
报错


image.png

增加参数:processData设置为false。因为data值是FormData对象,不需要对数据做处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容