如何使用 React 从 API 响应中保存 CSV 文件?

adn*_*n98 4 javascript csv reactjs

在我的应用程序中,我需要在计算机上保存来自 API 响应的 CSV 文件。发送 POST 请求的函数是(我使用的是 Redux):

export const postCsv = sensorData => (dispatch, getState) => {

  const token = getState().auth.token;

  // Headers
  const config = {
    headers: {
      'Content-Type': "application/json"
    }
  }

  // If token exists, add to headers config
  if (token) {
    config.headers['Authorization'] = `Token ${token}`
  }

  // Post request to API
  axios.post(`${baseURL}/sensors_data/csv`, sensorData, config)
  .then(res => {
    console.log(res);
    if (res.status === 200) {
      dispatch({
        type: POST_CSV,
        payload: res.data
      })
    }
  })
  .catch(err => {
    console.log(err.response);
  })
} 
Run Code Online (Sandbox Code Playgroud)

API 的响应是:

在此输入图像描述

我在单击按钮后执行 postCsv 函数。可以看到,响应码是200,所有数据都已正确发送。我只是不知道应该做什么来下载并保存文件。有人可以帮忙吗?

小智 14

const downloadFile = () => {
      const url = window.URL.createObjectURL(new Blob([response.data])) 
      const link = document.createElement('a')
      link.href = url
      link.setAttribute('download', "yourfilename.csv")
      document.body.appendChild(link)
      link.click()
      link.remove()
  }
Run Code Online (Sandbox Code Playgroud)


Sid*_*era 5

正如@cocco此线程中所建议的,您可以动态生成具有该download属性的锚点。

注意:为了简单起见,我将演示使用一个具有返回数据的静态方法的useEffect伪服务从 API 获取数据部分。但希望您能了解总体思路。HttpClientget

import React, { useState, useEffect } from "react";

import HttpClient from "./HttpClient";
import "./style.css";

export default function App() {
  const [dataInCSV, setDataInCSV] = useState("");

  useEffect(() => {
    HttpClient.get().then(res => setDataInCSV(res));
  }, []);

  return (
    <div>
      {dataInCSV && (
        <a
          href={`data:text/csv;charset=utf-8,${escape(dataInCSV)}`}
          download="filename.csv"
        >
          download
        </a>
      )}
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

这是供您参考的工作示例代码示例