【问题标题】:Node.js file extensions inside gzip compressiongzip 压缩中的 Node.js 文件扩展名
【发布时间】:2017-05-23 11:49:00
【问题描述】:

我想让客户端在特定的 url 上下载 gzip 压缩文件。我几乎可以正常工作 - 下载 {fileName}.gz 可以工作,但是当它解压缩时,它包含纯文件名,没有任何扩展名。我的文件是图像,所以我想要 .png.jpg 例如。我该怎么做?到目前为止,我得到了这个:

文件存储在服务器上,具有唯一的名称,由shortid 生成。在GET 到特定的url 我在数据库中找到我的产品,获取名称并将其设置为文件名,如下所示:

res.setHeader("Content-Disposition", "attachment; filename=test.gz");
res.writeHead(200, {"Content-Type": `image/png`});

然后压缩:

let gzip = zlib.createGzip();
fs.createReadStream(filePath)
  .pipe(gzip)
  .pipe(res);

我的问题是setHeader只设置了原始文件的名称,也就是压缩后的.gz文件。如何将要解压的文件名设置为“my-image.png”?

【问题讨论】:

    标签: node.js http download gzip


    【解决方案1】:

    zlib.Gzip 似乎不支持设置 FNAME ("原始文件名") 标志,这是您想要的。

    即便如此,标准的gunzip 工具通常不会使用原始文件名;您必须明确告诉它使用它,因此即使可能,您的用户也可能不会使用正确的选项将其解压缩为其原始文件名(也许 ZIP 格式更合适,因为它是“真正的" 存档格式,而 Gzip 或多或少是一种单文件压缩格式)。

    最后,您不得不怀疑压缩 PNG 或 JPG 文件是否真的有意义,因为两者都已经是压缩文件格式。也许您可以将文件大小减少几个百分点,但仅此而已。

    编辑:在仔细检查您的问题后,我现在意识到,因为您已经有了原始文件名,并且可以将其用作附件文件名的一部分,您可以在其后缀.gz.

    说原来的名字是my-image.png

    res.setHeader("Content-Disposition", "attachment; filename=my-image.png.gz");
    

    解压后会生成my-image.png,这正是您想要的。

    【讨论】:

    • 最初我将其标记为已接受,但当我想到它时 - 我不确定。如果不是图像文件,而是“.txt”怎么办?你是说Node.js解压后无法设置默认文件名吗?
    • @Alex 也许有一个模块可以实现 Gzip 并允许您设置原始文件名(不像内置的zlib.Gzip),但就像我说的,它完全取决于 解压缩 软件,如果实际使用了该名称(根据 Gzip 标准,它不是强制性的)。 macOS Finder 不会恢复到原始文件名,gunzip(CLI 工具)也不会(除非明确告知它应该这样做)。
    • @Alex hmm 愚蠢的问题,但现在我重读了你的问题,我想知道我是否没有让事情变得比现在更困难。您是否有文件的原始名称(例如,my-image.png)?如果是这样,您不能将my-image.png.gz设置为附件文件名吗?如果那个文件被解压了,它应该被保存为my-image.png,这就是我想的你想要的。
    • 就是这样。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多