2017-05-23 96 views
0

我想讓客戶端在特定的URL下載gzip壓縮文件。我幾乎可以工作 - 下載{fileName}.gz作品,但是當它解壓時,它包含純文件名,沒有任何擴展名。我的文件是圖像,所以我想要.png.jpg例如。我應該怎麼做?到目前爲止,我得到了這個:gzip壓縮中的Node.js文件擴展

文件存儲在服務器上,具有唯一的名稱,由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文件。如何設置文件名被解壓到「我的-image.png`?

回答

2

它看起來並不像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這是你想要什麼。

+0

最初我將它標記爲已接受,但是當我考慮它時 - 我不確定。如果它不是圖像文件,但是「.txt」會怎麼樣?你是否告訴我在Node.js解壓縮後不能設置默認文件名? – Alex

+0

@Alex也許有一個模塊可以實現Gzip並允許你設置原始文件名(不像內置的'zlib.Gzip'),但正如我所說的那樣,如果實際使用該名稱,它完全依賴於_decompression_軟件(根據Gzip標準,這不是強制性的)。 macOS Finder不會恢復到原來的文件名,'gunzip'(CLI工具)也不會(除非明確告訴它應該)。 – robertklep

+0

@亞馬遜嗯傻問題,但現在我重新讀你的問題,我想知道我是不是讓事情比他們更難。你有文件的原始名稱(例如'my-image.png')嗎?如果是這樣,你不能將'my-image.png.gz'設置爲附件文件名嗎?如果該文件被解壓縮,它應該保存爲'my-image.png',這正是我想要的。 – robertklep