如果我试图解释为什么我需要做我想做的事情需要很长时间,但基本上是这样的:我有FileUpload控件供用户选择Jpeg文件,我进行上传和之后我想将该文件转换为字节并将其用作Image控件的源。
我的代码就是这个:
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
,它可以解决问题。
更新 如上所述,这是我从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 :(得分:2)
所以你想要读取图像文件并转换为base 64.阅读完代码后,执行以下操作:
string valor = Convert.ToBase64String(buffer);
您的原始代码存在缺陷,因为您使用以下代码行将图像(以字节为单位)保存到文件中:
fileUpload1.SaveAs(fileName);
那不是保存为base64,因此您必须在阅读后将其转换为base 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);
答案 1 :(得分: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;
但我仍然不知道我之前的代码有什么问题,任何人都可以澄清一下?