今天在使用koa下載文件的時候,一直抱錯'invalid charactor',關鍵是明明測試都沒得問題的,鬱悶了老半天javascript
this.set({"Content-disposition": `attachment; filename=test.xlsx`}); this.set({'Content-type': 'application/vnd.ms-excel'}); this.body = buffer;
後來返現測試上用的是test.xlsx,而生產上是動態的文件名,有些時候會是中文,因此基本上確定了是header中編碼的問題。css
content-disposition是mime協議的擴展,而mime協議指示mime用戶代理如何顯示附加的文件,content-disposition其實能夠控制用戶請求所獲得內容爲一個文件時爲其提供一個文件名字,文件能夠是直接在瀏覽器上顯示或文件下載。java
注:disposition-type 文件的下載方式, inline直接在瀏覽器中打開,attachment以附件形式瀏覽器
http header中有content-type來指定body的編碼,可是header中卻沒有,若是header中攜帶裏信息卻沒有編碼(默認是ACSII碼),那瀏覽器是沒法識別header中信息的,可能就會致使某些問題。app
2010年 RFC 5987 發佈,正式規定了 HTTP Header 中多語言編碼的處理方式,應當採用相似 MIME 擴展的 parameter*=charset'lang'value 的格式,可是其中 value 應根據 RFC 3986 Section 2.1 使用百分號進行編碼,而且規定瀏覽器至少應該支持 ASCII 和 UTF-8 。koa
例如測試
Content-Disposition: attachment;filename="encoded_text";filename*=utf-8''encoded_text
對於ascii碼採用最簡單的filename='name.text'無需編碼,對於可能含有非acss碼(一般是UTF-8)建議使用上面的形式this
針對上面的問題我本身的代碼以下編碼
this.set({"Content-disposition": `attachment; filename*=UTF-8''${urlencode(name)}.xlsx`}); this.set({'Content-type': 'application/vnd.ms-excel'}); this.body = buffer;