如何从 Nextjs API 路径下载 PDF

问题描述 投票:0回答:1

我正在开发一个应用程序,允许用户从列表中下载 PDF 文件,我可以通过调用 MuleSoft 端点来访问此文件,它的设置是这样当用户点击下载按钮时,对 nextjs api 路由的调用是触发了

  const handleDownload = async () => {
    console.log('Downloading', documentKey);
    await fetch(`/api/retrive/${documentKey}`);
  };

/api/retrive/[documentKey]/route.ts
看起来像这样:

import { NextRequest } from "next/server";

type Params = {
  documentKey: string;
}

export async function GET(_: NextRequest, context: { params: Params }) {
  const documentKey = context.params.documentKey;

  const res = await fetch(`<my api endpoint>/api/v1/documents/${documentKey}`, {
    headers: {
      'Content-Type': 'application/json',
      client_id: process.env.CLIENT_ID,
      client_secret: process.env.CLIENT_SECRET
    },
    method: "GET",
  });

  const data = await res.json();
  // const base64Str = Buffer.from(data.content, 'utf8').toString('base64');

  const resData = await fetch(`data:${data.contentType},${data.content}`)
  const pdf = await resData.blob();
  console.log({ pdf })

  const headers = new Headers();
  headers.append("Content-Disposition", `attachment; filename="${data.documentName}"`);
  headers.append("Content-Type", data.contentType);

  return new Response(pdf, {
    headers,
  })
}

data
一些回复:

{
  content: <base64 encoded>,
  contentType: 'application/pdf',
  documentName: 'sample.pdf'
}

当我

console.log({ pdf })
我可以看到详细信息和文件大小,但没有触发下载,我错了什么?

pdf next.js base64
1个回答
0
投票

当您使用

fetch
发出请求时,响应将传回您的代码进行处理。浏览器不会根据对
fetch
调用的响应自动开始下载或执行任何操作。如果您使用
fetch
,则需要编写代码来对响应执行某些操作。

如果您希望浏览器下载文件,您可能不想使用

fetch
,而应该使用 api 路由的链接,而不是触发
fetch
的按钮。

© www.soinside.com 2019 - 2024. All rights reserved.