我有一个Reaction客户端和一个Node服务器.当我向服务器发送POST请求时,服务器应该压缩文件夹并将其下载到客户端.这是做不到的.将损坏的存档下载到客户端. 此外,服务器上的存档创建正确.

下面的代码示例 Reaction客户端

function test() {
    fetch("http://localhost:5000/download", {
      method: 'POST'
    })
    .then(res => res.blob())
    .then(data => {
      let url = URL.createObjectURL(data)
      let anchor = document.createElement('a')
      anchor.href = url
      anchor.download = 'ex_new.zip'
      document.body.appendChild(anchor)
      anchor.style = 'display: none'
      anchor.click()
      anchor.remove()

      URL.revokeObjectURL(url)
      document.removeChild(anchor)
    })
}

function App() {
  return (
    <button onClick={() => test()}>Test</button>
  );
}

export default App;

node 服务器

const archiver = require("archiver")
const express = require("express")
const cors = require("cors")
const fs = require("fs")
const path = require('path')


const app = express()
app.use(cors())

app.post("/download", (req, res) => {

    const archive = archiver('zip')
    archive.directory('output')
    archive.finalize()
    const output = fs.createWriteStream(__dirname + '/ex.zip')
    archive.pipe(output)
    return res.download('/home/user/Js', 'ex.zip')
})

app.listen(5000, () => console.log("Server start"))

Screenshot old error

Screenshot new error

Screenshot Chrome error

Networks Chrome

推荐答案

问题可能是您的 node 服务器没有正确发送ZIP文件.您正在使用archiver创建一个压缩文件并将其写入流,但是在发送响应之前,您没有判断流是否已经完成.这可能会使压缩文件损坏或不完整.您可以通过使用archive.finalize方法等待流完成,或者使用res.attachment方法立即发送文件来修复此问题.

例如:

app.post("/download", (req, res) => {
  const archive = archiver("zip");
  archive.directory("output");
  archive.finalize();
  res.attachment("ex.zip");
  archive.pipe(res);
});

Javascript相关问答推荐

为什么在react js中没有调用加载器函数?

如何通过继承contentitable属性的元素捕捉keydown事件?

使用redux-toolet DelivercThunks刷新访问令牌

是否有方法在OpenWeatherMap API中获取过go 的降水数据?

从mat—country—select获取整个Country数组

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

Angular:动画不启动

在拖放时阻止文件打开

使用Promise.All并发解决时,每个promise 的线性时间增加?

如何发送从REST Api收到的PNG数据响应

查询参数未在我的Next.js应用路由接口中定义

将Node.js包发布到GitHub包-错误ENEEDAUTH

Phaser3 preFX addGlow不支持zoom

Socket.IO在刷新页面时执行函数两次

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

如何压缩图像并将其编码为文本?

固定动态、self 调整的优先级队列

JavaScript:多个图像错误处理程序

AstroJS混合模式服务器终结点返回404

ReactJS在类组件中更新上下文