node.js 文件下载文件名乱码问题
发布于 10 年前 作者 ltccc 13185 次浏览 最后一次编辑是 8 年前

之前对http报文一知半解,今天整个文件下载做demo的时候文件名总是乱码。抓狂了2个点,终于好了QAQ 主要是 Content-Disposition这个报文头的编码。

看到了这个 http://www.2cto.com/kf/201208/147733.html 才知道,各种浏览器的不同的解析方式(你们这群大神们,就不能按标准来么TAT)。 经过我小电脑测试,IE9和chrome都是支持base64的,而火狐不支持url编码的,支持base64,但是有个让我抓狂的问题,node上也没找到一个适合的base64 encoder··而且那个网上提供的base64也不知道是如何编码的。。 贴上我的代码吧。大神们有时间试试呗><~~

var fs = require('fs');
var http = require('http');
var mime = require('mime');
var urlencode = require('urlencode');
var base64 = require('sixtyfour');
var path = "/opt/我是中文.txt"

http.createServer(function(req, res){
 res.writeHead(200,{
  // 'Content-Type':mime.lookup(path),
  'Content-Type':'application/octet-stream;charset=utf8',
  'Coneten-Length':fs.statSync(path).size,
  //'Content-Disposition':'attachment;filename='+urlencode('你好!')+'.txt'
//ie chrome支持
'Content-Disposition': "attachment; filename=\"=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?=\""
//火狐正确,chrome正确, ie不正确
 });
var opt = {
  flags:'r'//,
  //encoding:'utf-8',
  //autoClose:true
 };
 var stream = fs.createReadStream(path, opt);
 stream.pipe(res);
 stream.on('end', function(){
  res.end();
 });
}).listen(10000, "0");
console.log('Server running...'); 
2 回复

老天,,base64 是nodejs内置支持的编码之一呀~

感谢你,最终找到了都支持的方法 ’Content-Disposition’: “attachment;filename*=UTF-8’’”+urlencode(‘你好!’)+’.txt’

回到顶部