Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用存档创建内存,zip,然后在节点服务器上用膝关节炎将这个文件发送到客户端_Javascript_Node.js_Zip_Koa_Archiverjs - Fatal编程技术网

Javascript 用存档创建内存,zip,然后在节点服务器上用膝关节炎将这个文件发送到客户端

Javascript 用存档创建内存,zip,然后在节点服务器上用膝关节炎将这个文件发送到客户端,javascript,node.js,zip,koa,archiverjs,Javascript,Node.js,Zip,Koa,Archiverjs,i(作为一个带有膝关节炎框架的节点服务器),需要使用JSON BULB,将其转换为具有扩展名的文件.JSON,然后将其粘贴到ZIP存档中,然后响应客户端的请求将存档作为文件附件发送。p> 这样做的方法似乎是使用该工具。据我所知,这样做的方法是创建一个归档文件,将一个json博客作为.json文件附加到其中(它会自动在归档文件中创建该文件?),然后将该.zip文件“管道”到响应对象。“管道”模式是我理解失败的地方,主要是因为没有理解这些文档所说的内容 ,以及一些stackoverflow,使用的语

i(作为一个带有膝关节炎框架的节点服务器),需要使用JSON BULB,将其转换为具有扩展名的文件.JSON,然后将其粘贴到ZIP存档中,然后响应客户端的请求将存档作为文件附件发送。p> 这样做的方法似乎是使用该工具。据我所知,这样做的方法是创建一个归档文件,将一个json博客作为.json文件附加到其中(它会自动在归档文件中创建该文件?),然后将该.zip文件“管道”到响应对象。“管道”模式是我理解失败的地方,主要是因为没有理解这些文档所说的内容

,以及一些stackoverflow,使用的语言对我来说意味着“通过管道(zip文件)将数据传输到HTTP响应对象,将数据传输到客户端。例如,
ctx.body
可以直接设置为流,因此我尝试了以下内容:

尝试1

    const archive = archiver.create('zip', {});
    ctx.append('Content-Type', 'application/zip');
    ctx.append('Content-Disposition', `attachment; filename=libraries.zip`);
    ctx.response.body = archive.pipe(ctx.body);
    archive.append(JSON.stringify(blob), { name: 'libraries.json'});
    archive.finalize();
逻辑:应该将响应主体设置为流,并且该流应该是archiver流(指向ctx.body)

结果:.zip文件在客户端下载,但是zip格式不正确(无法打开)

尝试2

    const archive = archiver.create('zip', {});
    ctx.append('Content-Type', 'application/zip');
    ctx.append('Content-Disposition', `attachment; filename=libraries.zip`);
    archive.pipe(ctx.body);
    archive.append(JSON.stringify(blob), { name: 'libraries.json'});
    archive.finalize();
逻辑:将一个主体设置为一个流,在“将一个流指向它”之后,看起来确实很愚蠢,所以请复制其他stackoverflow示例

结果:与尝试1相同

尝试3次

基于

结果:
ctx.request.pipe
不是函数

我可能没有读对这篇文章,但网上的一切似乎都表明使用
archive.pipe(某种客户端发送的流)
“神奇地工作了。”,“流魔术”是他们使用的词

如何在内存中将JSON blob转换为.JSON,然后将.JSON附加到.zip,然后将其发送到客户端并下载,然后成功解压缩以查看.JSON

编辑:如果我在
archive.finalize()
之后将
ctx.body
记录到console.log中,它会显示一个
ReadableStream
,这似乎是正确的。但是,它有一个令我担心的“path”属性——我在“响应预览”中一直想知道的index.html“在客户端,我看到了index.html的字符串化版本。该文件仍在下载.zip,所以我不太担心,但现在我想知道这是否相关


EDIT2:深入查看客户端的响应,似乎返回的数据是直接向上发送的index.html,所以现在我非常困惑

是的,您可以直接将
ctx.body
设置为流。Koa会管好管道的。无需手动通过管道传输任何内容(除非您还希望通过管道传输到日志)

const archive=archiver('zip');
ctx.type='application/zip';
ctx.response.attachment('test.zip');
ctx.body=存档;
append(JSON.stringify(blob),{name:'libraries.JSON'});
archive.finalize();
    const archive = archiver.create('zip', {});
    ctx.append('Content-Type', 'application/zip');
    ctx.append('Content-Disposition', `attachment; filename=libraries.zip`);
    ctx.body = ctx.request.pipe(archive);
    archive.append(JSON.stringify(body), { name: 'libraries.json'});
    archive.finalize();