前端实现后端post请求返回的数据流下载excel显示无法打开,axiox请求封装加responseType属性

 今天做需求又是平平无奇的导出,以往项目框架里都是后端的get请求导出,

然后前端直接window.open(`地址 ', '_self')就可以实现下载了,

而今天突然来了个post请求的导出,直接用原来封装的post请求下载后获取的数据流

  非常尴尬的情况出现了

看一下现在导出的代码
this.props.dispatch({
  type: 'homePage/exportDeptRecordQuality',
  payload: {
    startTime: startTime || '2022-08-01',
    endTime: endTime || '2023-08-01',
  },
}).then((res: any) => {
  if (res) {
    console.log(res, 'res')
    const datas = res;
    const url = window.URL.createObjectURL(new Blob([datas], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }))
    const link = document.createElement('a')
    link.style.display = 'none'
    link.href = url;
    link.setAttribute('download', '病历基本信息报表22');
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link);
  }
})

 看了一下现在的项目请求封装是umi自带的,没有用老朋友axiox    

 猜测原因也许可能是没代入responseType: 'arraybuffer'(ps:不确定umi框架中的请求封装是否有这个字段的判断值,有网友了解可以指出学习一下嘿嘿)

import { extend } from 'umi-request';
//更详细的 api 文档: https://github.com/umijs/umi-request

 这时候决定重新用老朋友axiox给他封个post请求 

 记得带上responseType: 'arraybuffer'

直接上代码  request.js 封装post请求

// 网络请求配置
import axios from "axios";
import { message } from 'antd'
axios.defaults.withCredentials = true;

// http request 拦截器
axios.interceptors.request.use(
  (config) => {
    config.data = JSON.stringify(config.data);
    config.headers = {
      "Content-Type": "application/json",
    };
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// http response 拦截器
axios.interceptors.response.use(
  (response) => {
    return response;
  },
  (error) => {
    console.log("请求出错:", error);
  }
);

// 封装post请求
export function post(url, data, config) {
  return new Promise((resolve, reject) => {
    console.log(url, data, config)
    axios.post(url, data, config).then(
      (response) => {
        //关闭进度条
        resolve(response.data);
      },
      (err) => {
        reject(err);
      }
    );
  });
}

 请求调用函数封装 service.js'

很关键的来了!!!记得加入 responseType: 'arraybuffer

import { post } from "../../utils/request";

export function downTem(data: any) {
  console.log(data, 'data')
  return post(`${getServerPath()}/emr/exportDeptRecordQuality`, data, { responseType: 'arraybuffer' });
}

页面调用

downTem(data).then((res) => {
  const datas = res;
  const url = window.URL.createObjectURL(new Blob([datas], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }))
  const link = document.createElement('a')
  link.style.display = 'none'
  link.href = url;
  link.setAttribute('download', '病历基本信息报表');//文件名
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link);
})

成功导出打开文件

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以尝试使用Apache HttpClient来封装post请求为Java函数,具体的步骤可以参考官方文档中的例子:http://hc.apache.org/httpclient-3.x/tutorial.html#Using%20the%20POST%20method ### 回答2: 将 post 请求封装为 Java 函数可以通过使用 Java 的 HttpURLConnection 类来实现。以下是一个基本的封装函数的示例: ```java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class PostRequest { public static String sendPostRequest(String url, String data) throws IOException { HttpURLConnection connection = null; BufferedReader reader = null; try { // 创建 URL 对象 URL postUrl = new URL(url); // 打开连接 connection = (HttpURLConnection) postUrl.openConnection(); // 设置请求方法为 POST connection.setRequestMethod("POST"); connection.setDoOutput(true); // 设置请求体的内容类型为 application/json connection.setRequestProperty("Content-Type", "application/json"); // 发送 POST 请求的正文 DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes(data); outputStream.flush(); outputStream.close(); // 获取响应的状态码 int responseCode = connection.getResponseCode(); // 读取响应结果 reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } // 返回响应结果 return response.toString(); } finally { if (reader != null) { reader.close(); } if (connection != null) { connection.disconnect(); } } } } ``` 在上面的示例中,我们首先创建了一个 URL 对象,然后打开连接并设置请求方法为 POST。我们还设置了请求体的内容类型为 application/json。接下来,我们将请求数据写入请求正文,并发送请求。然后我们获取响应的状态码,然后使用 BufferedReader 读取响应结果并将其存储到 StringBuilder 对象中。最后,我们返回响应结果。 你可以通过调用 `sendPostRequest(url, data)` 的方式来使用该函数,其中 `url` 代表请求的 URL,`data` 代表请求的数据。 需要注意的是,上述示例中的代码只是一个简单的封装示例,并且假设请求的数据是以字符串形式传递的。实际上,我们可能会在数据的基础上进行一系列的操作,例如序列化、密等。在实际使用中,我们需要根据具体的需求进行适当的调整和优化。 ### 回答3: 将post请求封装成Java函数的过程需要使用Java中的HttpURLConnection类和BufferedReader类来实现。Java函数可以包括以下步骤: 1. 创建URL对象,指定要发送post请求的地址。 2. 打开URL连接,得到HttpURLConnection对象。 3. 设置请求参数和请求头,如设置请求方法为post、设置Content-Type为application/json等。 4. 获取输出流,通过输出流向服务器发送post请求的参数和数据。 5. 获取响应码,通过HttpURLConnection对象的getResponseCode()方法。 6. 根据响应码判断请求是否成功,如果成功则获取输入流。 7. 创建BufferedReader对象,读取服务器返回的数据。 8. 将服务器返回的数据保存到StringBuilder中,通过循环读取并拼接字符串。 9. 关闭输入流和输出流,释放资源。 10. 返回获取到的服务器返回数据。 以下是一个简单的示例代码: ``` import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class PostRequestExample { public static String sendPostRequest(String url, String params) { StringBuilder response = new StringBuilder(); try { URL postUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); OutputStream outputStream = connection.getOutputStream(); outputStream.write(params.getBytes("UTF-8")); outputStream.flush(); outputStream.close(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); } connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } return response.toString(); } public static void main(String[] args) { String url = "http://example.com/api"; String params = "key1=value1&key2=value2"; String result = sendPostRequest(url, params); System.out.println(result); } } ``` 以上示例代码封装了一个名为sendPostRequest的函数,接受一个url和params参数,通过post请求发送数据,并返回服务器返回的数据。在main函数中调用sendPostRequest函数并传入示例的url和params即可执行post请求

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值