Chrome js:防止响应中的文件(作为Buffer)被解析为JSON

omjgkv6w  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(84)

我有一个使用Next.js API的服务器,我想从那里向前端发送一个以特定于区域设置的编码(Shift_JIS)编码的.csv文件。
我的服务器目前使用这种方法:

download(res: NextApiResponse, buffer: Buffer, fileName: string) {
    res.status(200)
    res.setHeader('Content-Type', 'text/csv')
    res.setHeader('Content-Disposition', 'attachment; filename="' + fileName + '"')
    res.send(buffer)
}

查看服务器调试器中的日志,这部分似乎工作正常。
前端页面使用以下代码:

try {
    const response = await api.getRequestCsv({
    // insert necessary parameters here
    })
    console.log('tried', response)
} catch (e) {
    console.log('caught', e)
}

API对象执行以下操作:此.request<{ /* @format binary */ file?:File },any >({ path:/safdsfa/download,方法:'GET',查询:{code:'123'},格式:'json',})
api.getRequestCsv()中发送的GET请求正确解析,但是当我console.log它时,我得到了这个(为了简洁和保密而删节):

Response {
    data: null
    error: "Unexpected token '�', "�v���W�F�N"... is not valid JSON"
    body: ReadableStream
        locked: true
    bodyUsed: true
    ok: true
    status: 200
    statusText: "OK"
    type: "basic"
    url: // insert intended URL here
}

我的怀疑是前端接收到响应,* 在某个地方 *,它将文件解析为UTF-8 JSON字符串,而它应该按原样下载流。
我如何强制前端下载响应中的文件,而不是假设它是一个JSON字符串并在不应该的时候解析它?

wf82jlnq

wf82jlnq1#

我想好了服务器期望使用包含文件的JSON对象进行响应,而不是直接使用文件进行响应。我重写了后端响应:

download(res: NextApiResponse, buffer: Buffer, fileName: string) {
    res.status(200)
    res.setHeader('Content-Type', 'text/csv')
    res.setHeader('Content-Disposition', 'attachment; filename="' + fileName + '"')
    res.send({file: buffer}) // changed
}

并在前端做了一些复杂的事情,从那里提取缓冲区并在本地下载。

相关问题