0

如果我试图解释为什么我需要做我想做的事情,那将需要很长时间,但基本上是这样的:我有 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变量保存到数据库中。

希望这能澄清我的问题

4

3 回答 3

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);
于 2013-07-01T13:46:54.633 回答
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;

但是我仍然不知道我以前的代码有什么问题,任何人都可以澄清一下吗?

于 2013-07-01T13:46:13.323 回答
0

这个解决方案对我有用:

System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fs);
//Add this--------------------
fs.Seek(0, SeekOrigin.Begin);
//----------------------------
long byteLength = new System.IO.FileInfo(fileName).Length;
byte[] buffer = binaryReader.ReadBytes((Int32)byteLength);

只需添加突出显示的行。

于 2021-11-11T10:39:18.467 回答