我如何在我的服务器上用express和node创建一个文件,然后将其下载到我的客户端,

fjaof16o  于 12个月前  发布在  Node.js
关注(0)|答案(3)|浏览(137)

我如何在我的服务器上的express和node中创建一个文件,然后将其下载到我的客户端。我使用NextJS作为我的前端和后端。我很困惑,在服务器文件夹的根目录上创建文件后,我如何在前端下载文件。由于我使用React作为我的前端,每当我尝试访问该文件路径时,它都会尝试将我带到页面而不是文件
这是我在Node的快速路线

var xls = json2xls(json, {
    fields
  });

  // If there isn't a folder called /temp in the
  // root folder it creates one
  if (!fs.existsSync('./temp')) {
    fs.mkdirSync('./temp');
  }

  const fileName = `temp/${req.user.first_name}${req.body._id + Date.now()}.xlsx`

  // fs.writeFileSync(fileName, xls, 'binary');

  fs.writeFile(fileName, xls, 'binary', function (err, result) {
    if (err) {
      return console.log(err);
    }


    console.log(result, 'this is result')
  });

字符串
这是我的前端

axios.post('api/download',payload)
  .then(res => {
    const link = document.createElement('a');
    link.href = res.data.url;
    link.download
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  })
  .catch(err => {
    throw err
  })

8dtrkrch

8dtrkrch1#

1.你能在API上用GET发出请求吗?
1.使用GET请求。

qvtsj1bj

qvtsj1bj2#

temp目录设置为静态资源目录:

app.use(express.static('temp')); // app is your express instance.
// Maybe you have to correct temp's path

字符串
使用文件URL数据响应POST请求

fs.writeFile(fileName, xls, 'binary', function (err, result) {
    if (err) {
      return console.log(err);
      res.status(500).json({err});
    }


    console.log(result, 'this is result');

    res.json({url: 'http://localhost:8080/temp/' + fileName}); // res is response object of you router handler.
    // Maybe you have correct the server address
  });


另一种方式是,您可以将xls二进制文件直接发送到客户端,在客户端中,您可以从响应中创建一个BLOB对象,然后为该BLOB对象创建下载链接。

5t7ly7z5

5t7ly7z53#

这里有一个前端的示例代码供您参考:
在我的例子中,服务器端页面不能将blob对象从服务器传输到客户端。
因此,我使用一个名为download-button.tsx的组件解决了这个问题,该组件用于下载Excel文件。
component/download-button.tsx

async function download() {
  window.location.href = '/api/download';
}

<Button onClick={() => download()}>Download</Button>

字符串
API/download/route.ts

export async function GET(req: Request) {
  const requestUrl = `${apiBaseUrl}/path`;
        
  const fetchResponse = await fetch(requestUrl, {
   method: 'GET',
   headers: {
    Authorization: `Bearer ${accessToken}`,
   },
  });
        
  return new Response(fetchResponse.body, {
   headers: {
   ...fetchResponse.headers,
   'content-disposition': `attachment; filename="filename.xlsx"`,
   },
  });
}

相关问题