2013-07-01 142 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; 

但我仍然不知道什么是错误的与我以前的代码,任何人都可以澄清?