下載文件亂碼問題,並提供轉碼方法


不知大家遇沒遇到過這種情況,大多數瀏覽器下載文件時,彈出的下載框上的文件名都是正常,唯獨火狐或IE文件名顯示亂碼,這種情況一般不用解決,直接下載下來就行了,因為內容不是亂碼,可以正常閱讀取用,不過如果遇到特別較真的,特別愛鑽牛角尖的朋友呢?不解決睡不着覺呀,為了挽救這些愛鑽牛角尖的朋友,列出如下代碼:

直接調用ToHexString(string s)方法即可:

protected void Page_Load(object sender, EventArgs e)
        {
            DocControl dc = new DocControl();

            File file = dc.GetFile(FileID);
            if (file == null) return;
            if (!System.IO.File.Exists(System.IO.Path.Combine(HttpPath, file.FilePath)))
            {
                Response.Write("文件不存在");
                Response.End();
            }
            byte[] filesoure = System.IO.File.ReadAllBytes(System.IO.Path.Combine(HttpPath, file.FilePath));
            if (filesoure != null)
            {
                string _fileExtension = file.FileExtension.Substring(1);
                Response.ContentType = _fileExtension;

                string _fileName = file.FleName;
                if (Request.UserAgent.Contains("MSIE 7.0") || Request.UserAgent.Contains("msie 7.0"))
                {
                    if (_fileName.Length > 16)
                        _fileName = _fileName.Substring(0, 12) + "." + _fileExtension;
                }
                _fileName = ToHexString(_fileName);

                Response.AddHeader("content-disposition", "inline;filename=" + _fileName);
                Response.AppendHeader("Content-Type", _fileExtension);
                Response.AddHeader("Content-Length", "" + filesoure.Length);
                Response.BinaryWrite(filesoure);
                Response.Flush();
                Response.End();
            }

        }



/// <summary>
        /// 為字符串中的非英文字符編碼        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public string ToHexString(string s)
        {
            char[] chars = s.ToCharArray();
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < chars.Length; index++)
            {
                bool needToEncode = NeedToEncode(chars[index]);
                if (needToEncode)
                {
                    string encodedString = ToHexString(chars[index]);
                    builder.Append(encodedString);
                }
                else
                {
                    builder.Append(chars[index]);
                }
            }
            return builder.ToString();
        }
        /// <summary>
        ///指定 一個字符是否應該被編碼
        /// </summary>
        /// <param name="chr"></param>
        /// <returns></returns>
        private bool NeedToEncode(char chr)
        {
            string reservedChars = "$-_.+!*'(),@=&";
            if (chr > 127)
                return true;
            if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
                return false;
            return true;
        }
        /// <summary>
        /// 為非英文字符串編碼        /// </summary>
        /// <param name="chr"></param>
        /// <returns></returns>
        private string ToHexString(char chr)
        {
            UTF8Encoding utf8 = new UTF8Encoding();
            byte[] encodedBytes = utf8.GetBytes(chr.ToString());
            StringBuilder builder = new StringBuilder();
            for (int index = 0; index < encodedBytes.Length; index++)
            {
                builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
            }
            return builder.ToString();
        }

        private string NewString(string str)
        {
            string filename = System.IO.Path.GetFileNameWithoutExtension(str);
            return ToHexString(filename);

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM