我用C#开发了一个小型文件共享站点。用firefox下载文件时,如果文件名含有中文,就会乱码,但用IE和chrome下载却不会出现。
究其原因,是IE和Chrome不会对下载文件的文件名进行改动,而firefox会自动对下载文件的文件名做一次URI编码,所以必须在后台对返回的文件名字符串作判断处理。
解决办法如下:
protected void Page_Load(object sender, EventArgs e)
{
string myFileName = "";
string filePath;
System.IO.FileInfo fileInfo;
string agent = "";
bool isIe = false;
//检查客户端类型
agent = Request.UserAgent;
if (agent != null && agent != "" && agent.IndexOf("MSIE") < 0) //非IE浏览器
isIe = false;
else
isIe = true;
//开始传输
filePath = "c:\\测试.txt";
myFileName = "测试.txt";
fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//每次读取100K缓解服务器压力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.Charset = "utf-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;
if (isIe) //只有当客户端是IE才对文件名做URI编码
{
myFileName = Uri.EscapeDataString(myFileName);
}
Response.AddHeader("Content-Disposition", "attachment; filename=" + myFileName);
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
iStream.Close();
}
}