2013-07-01 58 views
0

如果我試圖解釋爲什麼我需要做我想做的事情需要很長時間,但基本上是這樣的:我有FileUpload控件供用戶選擇一個Jpeg文件,我做了上傳,之後我想將該文件轉換爲字節並將其用作Image控件的源代碼。BinaryReader.ReadBytes轉換爲字符串時返回垃圾

我的代碼是這一個:

string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg"; 
fileUpload1.SaveAs(fileName); 

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
long byteLength = new System.IO.FileInfo(fileName).Length; 
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
fs.Close(); 
fs.Dispose(); 

string valor = System.Text.Encoding.UTF8.GetString(buffer); 
img.ImageUrl = "data:image/jpg;base64," + valor; 

的字節數組正在尋找好的,但是當我將其轉換爲字符串,它充滿了無法識別的字符,我還有一個網頁,我做同樣的事情,但不是從文件中獲取字節我從MySql數據庫獲取並使用相同的System.Text.Encoding.UTF8.GetString,它可以解決問題。

UPDATE 至於問,這是從MySQL數據庫中檢索,當我使用的代碼:

DataView dv = (DataView)SqlDataSource3.Select(DataSourceSelectArguments.Empty); 
byte[] buffer = (byte[])dv.Table.Rows[0]["BIN_FOTO"]; 
string valor = System.Text.Encoding.UTF8.GetString(buffer); 
img.ImageUrl = "data:image/jpg;base64," + valor; 

的選擇這個SqlDataSource3的是一個簡單的Select BIN_FOTO from temp_image。我存儲在數據庫中該值從攝像頭捕捉WPF程序代碼中,我使用的圖像拍攝的攝像頭是轉換:

private string ImageToBase64String(System.Drawing.Image imageData, ImageFormat format) 
    { 
     string base64; 
     MemoryStream memory = new MemoryStream(); 
     imageData.Save(memory, format); 
     base64 = System.Convert.ToBase64String(memory.ToArray()); 
     memory.Close(); 
     memory.Dispose(); 

     return base64; 
    } 

然後我的base64變量保存到數據庫中。

希望這澄清了我的問題

+0

解釋的圖像字節數組的字符串是不會給你任何可理解的東西。看看你的圖像如何存儲在MySql中將會很有趣。有可能在保存或檢索中進行一些轉換。 –

+0

已更新它以顯示我如何保存到MySql。 –

回答

2

所以,你想讀的圖像文件,並轉換爲基礎64.你的閱讀代碼後,這樣做:

string valor = Convert.ToBase64String(buffer); 

你原來的代碼是有缺陷的,因爲你保存圖像,以字節爲單位,以使用以下代碼行的文件:

fileUpload1.SaveAs(fileName); 

這不是作爲base64保存的,因此您必須在讀取它之後將其轉換爲基本64。您的MySql閱讀工作,因爲數據被保存前轉換爲base64。

順便說一句,有沒有必要在此代碼BinaryReader

System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
long byteLength = new System.IO.FileInfo(fileName).Length; 
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
fs.Close(); 
fs.Dispose(); 

你可以代替寫:

byte[] buffer; 
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read) 
{ 
    long byteLength = fs.Length; 
    buffer = new byte[byteLength]; 
    int bytesRead = fs.Read(buffer, 0, byteLength); 
    // optional error check to see that you got all the bytes 
    if (bytesRead != byteLength) 
    { 
     // handle error 
    } 
} 
string valor = Convert.ToBase64String(buffer); 
+0

是的,我在找到答案之前幾秒鐘就發現了這個問題,不過謝謝,但是第一種方法的問題是什麼?它在我從數據庫獲取字節時起作用,但當它們來自文件時,它停止工作。 –

+0

感謝您的解釋! –

0

我發現這個問題,看我以前的圖像轉換爲Base64String的WPF代碼。我剛剛創建的相同功能ImageToBase64String,現在,它的工作原理:

 string fileName = Server.MapPath("~/TempImages") + @"\foto.jpg"; 
     fileUpload1.SaveAs(fileName); 

     System.Drawing.Image teste = System.Drawing.Image.FromFile(fileName); 

     string valor = ImageToBase64String(teste, System.Drawing.Imaging.ImageFormat.Jpeg); 

     //System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
     //System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs); 
     //long byteLength = new System.IO.FileInfo(fileName).Length; 
     //byte[] buffer = binaryReader.ReadBytes((Int32)byteLength); 
     //buffer = File.ReadAllBytes(fileName); 
     //fs.Close(); 
     //fs.Dispose(); 

     //string valor = System.Text.Encoding.UTF8.GetString(buffer); 
     img.ImageUrl = "data:image/jpg;base64," + valor; 

但我仍然不知道什麼是錯誤的與我以前的代碼,任何人都可以澄清?