VUE上传下载攻略

问题

项目中通过ESB去执行上传下载的时候发现乱码的问题。
之后上传功能通过解析java成功上传的报文格式。解决问题

代码

  1. JAVA版本上传
  @Autowired
    private RestTemplate restTemplate;

    @Test
    public void postUploadEsb() {
        HttpHeaders httpHeaders = new HttpHeaders();
        MediaType mediaType = new MediaType("application","octet-stream", Charset.forName("UTF-8"));
        httpHeaders.setContentType(mediaType);
        FileSystemResource resource = new FileSystemResource(new File("B://新建文本文档.zip"));
        HttpEntity<FileSystemResource> fileEntity = new HttpEntity<>(resource,httpHeaders);
        MultiValueMap<String,Object> paraMap = new LinkedMultiValueMap<>();
        paraMap.add("file", fileEntity);
        String esbRequestData ="{\n" +
                "    \"Service\":{\n" +
                "        \"Header\":{\n" +
                "            \"Request\":{\n" +
                "                \"Bcode\":\"\",\n" +
                "                \"ReqSysCode\":\"S76\",\n" +
                "                \"ReqTime\":\"20190805153144327\",\n" +
                "                \"ReqType\":\"0\",\n" +
                "                \"Security\":{\n" +
                "                    \"AppKey\":\"81f2b3c9-8392-424c-9a54-4a7532518a99\",\n" +
                "                    \"SessionId\":\"4D00489427767A348A745DA1801CCC36\"\n" +
                "                },\n" +
                "                \"SerialNumber\":\"S76af256cfa479b4faf8f98e9735221ff39\",\n" +
                "                \"ServiceCode\":\"S01_COMM_C_00327\",\n" +
                "                \"Ucode\":\"\"\n" +
                "            }\n" +
                "        },\n" +
                "        \"Body\":{\n" +
                "            \"Request\":{\n" +
                "                \"usercode\":\"000000008410\",\n" +
                "                \"tablename\":\"printsave\",\n" +
                "                \"icodename\":\"docid\",\n" +
                "                \"filepathname\":\"docname\",\n" +
                "                \"compresspathname\":\"\",\n" +
                "                \"relatelist\":[\n" +
                "                    {\n" +
                "                        \"key\":\"sheettbl\",\n" +
                "                        \"value\":\"js_ydyy_busitips\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"key\":\"doctype\",\n" +
                "                        \"value\":\"0\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"key\":\"sheetid\",\n" +
                "                        \"value\":\"GL0000000000000006\"\n" +
                "                    }\n" +
                "                ]\n" +
                "            }\n" +
                "        }\n" +
                "    }\n" +
                "}";
        paraMap.add("payload",esbRequestData);
        this.postFile("http://localhost:8091/esb",paraMap);
    }
    public JSONObject postFile(String url, MultiValueMap<String,Object> paraMap){
        try{
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
            FormHttpMessageConverter formConverter = new FormHttpMessageConverter();
            formConverter.setCharset(StandardCharsets.UTF_8);
            formConverter.setMultipartCharset(StandardCharsets.UTF_8);
            restTemplate.getMessageConverters().set(1,formConverter);

            restTemplate.getMessageConverters().set(2,new StringHttpMessageConverter(Charset.forName("UTF-8")));
            HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String,Object>>(paraMap,headers);
            ResponseEntity<String> repoResponseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
            String json = repoResponseEntity.getBody();
            JSONObject result = JSONObject.fromObject(json);
            System.out.println(result.toString());
            return result;
        }catch (HttpStatusCodeException e) {
            throw e;
        }

    }

报文

通过拦截器得到报文。发现问题

  • filename =?UTF-8?B?5paw5bu65paH5pys5paH5qGjLnppcA==?=
    ?UTF-8?B? ?=这个是邮件头的编码格式 B表示是Base64编码 UTF-8表示字符集的编码
    5paw5bu65paH5pys5paH5qGjLnppcA== 这个是普通的base64编码

  • 报文中格式为二进制流的方式

最终vue下载的方法

 let fd = new FormData();
      console.log(file);
      let Base64 = require("js-base64").Base64;
      // var b = new Base64();
      var newName = Base64.encode(file.name);

      let reader = new FileReader()
      if (typeof FileReader === 'undefined') {
        alert('您的浏览器不支持FileReader接口')
        return
      }
     let _this = this;
      reader.readAsBinaryString(file)
      reader.onload = function () {
          console.log(reader.result);      
           let newFile = new File([reader.result], "=?UTF-8?B?" + newName + "?=", {
            type: "application/octet-stream;charset=UTF-8"
          });          +
           fd.append("file", newFile); //传文件
      let val = {
        usercode: localStorage.getItem("userCode") || "",
        tablename: "printsave", //附件保存表名
        icodename: "docid", //附件保存表字段-内码
        filepathname: "docname", //附件保存表字段-附件地址名
        compresspathname: "", //附件保存表字段-压缩附件地址名
        relatelist: [
          {
            key: "sheettbl",
            value: "js_ydyy_busitips"
          },
          { key: "doctype", value: "0" },
          {
            key: "sheetid",
            value: _this.upload_busitipsicode //内码
          }
        ]
      };
      let ReqTime = _this.getReqTime();
      let uuid = _this.getUUID();
      let SessionId = sessionStorage.getItem("sessionID") || "";
      let data_val = {
        Service: {
          Header: {
            Request: {
              Bcode: "",
              ReqSysCode: "S76",
              ReqTime: ReqTime,
              ReqType: "0",
              Security: {
                AppKey: "81f2b3c9-8392-424c-9a54-4a7532518a99",
                SessionId: SessionId
              },
              SerialNumber: "S76" + uuid,
              ServiceCode: "S01_COMM_C_00327",
              Ucode: ""
            }
          },
          Body: {
            Request: val
          }
        }
      };
      fd.append("payload", JSON.stringify(data_val));
      console.log("-------");
      console.log(fd);
      let config = {
        headers: {
          "Content-Type": "charset=UTF-8;multipart/form-data;"
        }
      };
      let requestURL = requestUrl("");
      _this.$axios
        .post(requestURL, fd, config)
        .then(res => {
          let header = res.data.Service.Header.Response;
          let body = res.data.Service.Body.Response;
          if (header && header.ReturnCode == "000000000") {
          } else {
            _this.$message.error(header.ReturnMessage);
          }
        })
        .catch(err => {});
        }

主要通过formData上传数据

用FileReader来解析数据,并且改变附件报文头以及名称。
let reader = new FileReader()
reader.readAsBinaryString(file)
      reader.onload = function () {
          console.log(reader.result);      
           let newFile = new File([reader.result], "=?UTF-8?B?" + newName + "?=", {
            type: "application/octet-stream;charset=UTF-8"
          });          +
           fd.append("file", newFile); //传文件

附件下载

 bigdownload(val) {
      let docname = val.filepath.split("|")[0];
      let docname2 = val.filepath.split("|")[1];
      let _data = {
        usercode: localStorage.getItem("userCode") || "",
        docname: docname
      };
      this.listLoading = true;

      let requestURL = requestUrl("");
      let ReqSysCode = "S76";
      let ReqTime = this.getReqTime();
      let uuid = this.getUUID();
      let SessionId = sessionStorage.getItem("sessionID") || "";
      let userCode = sessionStorage.getItem("userCode") || "";

      this.$axios({
        url:requestUrl("/esbdownload"),
        method: "POST",
        responseType: "blob",
        data: JSON.stringify({
          Service: {
            Header: {
              Request: {
                Bcode: "",
                ReqSysCode: ReqSysCode,
                ReqTime: ReqTime,
                ReqType: "0",
                Security: {
                  AppKey: "81f2b3c9-8392-424c-9a54-4a7532518a99",
                  SessionId: SessionId
                },
                SerialNumber: ReqSysCode + uuid,
                ServiceCode: "S01_COMM_R_00119",
                Ucode: userCode
              }
            },
            Body: {
              Request: _data
            }
          }
        })
      })
        .then(response => {
          console.log(response);
          this.download(response.data, docname2);
        })
        .catch(error => {});
    },
    // 下载文件
    download(data, name) {
      this.listLoading = false;
      if (!data) {
        return;
      }
      let content = data;
      let blob = new Blob([content], {
        type:
          "application/octet-stream;charset=UTF-8"
      });
      let url = window.URL.createObjectURL(blob);
      let link = document.createElement("a");
      link.style.display = "none";
      link.href = url;
      link.setAttribute("download", name);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link); // 下载完成移除元素
      window.URL.revokeObjectURL(url); // 释放掉blob对象
    }
  }

注意点

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

推荐阅读更多精彩内容

  • 每个文本编辑器都有默认的编码方式(比如 UTF-8 编码),当我们保存文档的时候,可以选择编码方式,如果没有特意选...
    _于曼丽_阅读 1,519评论 0 1
  • 1.计算机出现以前的密码 这篇文章旨在浅显易懂的介绍标题所述的各个算法概念与应用,文中没有数学公式。在主要概念出现...
    ZIJIAN94阅读 1,839评论 0 2
  • 敬爱的李老师,智慧的马教授,亲爱的家人们:大家好,我是华夏炜烨机械有限公司的张文亮,今天是我日精进第15天,跟大家...
    亮_4094阅读 105评论 0 1
  • 当时 这片潮水退去的沙滩,在若干年后浮现,那么像祼露在岁月里的高地,清晰无比的呈现,就连当时的潮汐涨落声都仿...
    午夜华灯阅读 912评论 6 5
  • 相信自己 每个人在接触新事物的时候,总会问自己“我从来没干过,我行吗?”,或干...
    银河湾阅读 557评论 0 0