前些日子為瞭解決跨域檔案互動和上傳檔案。把檔案轉換成二進位進行傳輸,方便儲存。
首先在上傳檔案的時候有問題,那就是電腦的案頭檔案和某些盤的檔案有許可權的控制,禁止訪問。
後來查了查,有好多貼說要設定電腦,作為web程式也不能讓每一個電腦都設定呀,太麻煩了。
解決原來是iis的連接埠不能是100左右的連接埠。
解決問題在webconfig中就能設定。加入以下代碼就ok了。
<system.web><br /><identity impersonate="true" userName="使用者名稱" password="密碼"/><br /><authorization><br /> <allow users="?"/> <!--deny表示禁止,users="?"表示匿名使用者 allow表示允許<br />--><br /></authorization><br /></system.web>
下面是檔案儲存和下載的代碼。
string path = @"C:/Documents and Settings/Administrator/案頭/建立 文字文件.txt"; //檔案實體路徑<br /> int fcount = 0;<br /> string contenttype = "";<br /> string filename = "";</p><p> FileInfo fi = new FileInfo(path); //擷取檔案資訊<br /> fcount = (int)fi.Length;<br /> contenttype = fi.Extension;<br /> filename = fi.FullName.Substring(fi.FullName.LastIndexOf('//') + 1, fi.FullName.LastIndexOf('.') - fi.FullName.LastIndexOf('//') - 1);<br /> FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);//讀取檔案<br /> BinaryReader br = new BinaryReader(fs);<br /> byte[] photo = br.ReadBytes(fcount);<br /> br.Close();<br /> fs.Close();</p><p> Session["test"] = photo; //將檔案二進位儲存到Session中</p><p> byte[] by = (byte[])Session["test"]; //擷取session資訊<br /> filename = setting.ToHexString(filename);//為了防止中文的亂碼,對其進行轉碼。<br /> Response.AddHeader("Content-Disposition", "attachment; filename=" + filename + contenttype + "");//設定讀取的檔案頭<br /> Response.AddHeader("Content-Length", by.Length.ToString());<br /> Response.ContentType = "application/octet-stream"; //設定輸出類型 這裡可以儲存在資料庫中 動態實作類別型<br /> Response.OutputStream.Write(by, 0, by.Length); //輸出<br /> Response.Flush();<br /> Response.End();
setting.ToHexString(filename)方法是解決檔案流中文亂碼問題。下的方法是在網上找的非原創。
共用給大家,在此感謝作者。
/// <summary><br /> /// 為字串中的非英文字元編碼<br /> /// </summary><br /> /// <param name="s"></param><br /> /// <returns></returns><br /> public static string ToHexString(string s)<br /> {<br /> char[] chars = s.ToCharArray();<br /> StringBuilder builder = new StringBuilder();<br /> for (int index = 0; index < chars.Length; index++)<br /> {<br /> bool needToEncode = NeedToEncode(chars[index]);<br /> if (needToEncode)<br /> {<br /> string encodedString = ToHexString(chars[index]);<br /> builder.Append(encodedString);<br /> }<br /> else<br /> {<br /> builder.Append(chars[index]);<br /> }<br /> }</p><p> return builder.ToString();<br /> }</p><p> /// <summary><br /> ///指定 一個字元是否應該被編碼<br /> /// </summary><br /> /// <param name="chr"></param><br /> /// <returns></returns><br /> private static bool NeedToEncode(char chr)<br /> {<br /> string reservedChars = "$-_.+!*'(),@=&";</p><p> if (chr > 127)<br /> return true;<br /> if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)<br /> return false;</p><p> return true;<br /> }</p><p> /// <summary><br /> /// 為非英文字串編碼<br /> /// </summary><br /> /// <param name="chr"></param><br /> /// <returns></returns><br /> private static string ToHexString(char chr)<br /> {<br /> UTF8Encoding utf8 = new UTF8Encoding();<br /> byte[] encodedBytes = utf8.GetBytes(chr.ToString());<br /> StringBuilder builder = new StringBuilder();<br /> for (int index = 0; index < encodedBytes.Length; index++)<br /> {<br /> builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));<br /> }<br /> return builder.ToString();<br /> }
顯示沒有處理的中文亂碼問題。
處理後的顯示
呵呵,希望大家多多交流。