在background-image中加载图像(保存在MSSQL中 - varbinary)

时间:2015-05-18 11:58:11

标签: c# css sql-server

我正在使用以下代码将图像保存到表格中:

if (FileUploadControl.PostedFile.ContentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
{
    byte[] imagedata = MSImage.ConvertToByte(FileUploadControl);
    if (imagedata != null)
    {
        string param = "@Image";
        SqlParameter sp = spc.Add(new SqlParameter(param, SqlDbType.VarBinary, -1));
        sp.Value = imagedata;
        sql += ", " + Q.C(Database.MSImage) + "=" + param + ", " + Q.C(Database.MSImageType) + "=N'" + FileUploadControl.PostedFile.ContentType + "'";
    }
}

尝试使用以下代码将其加载到background-image样式中:

string imagedata = MSImage.ConvertToImage((byte[])ms[Database.MSImage]);
if (imagedata != null && ms[Database.MSImageType] != DBNull.Value && ((string)ms[Database.MSImageType]).StartsWith("image/", StringComparison.OrdinalIgnoreCase))
{
    takzir2.InnerHtml = "<div class='msbgimage' style=\"background-image:url(data:" + (string)ms[Database.MSImageType] + ";base64, " + imagedata + ")\"></div>";
}

问题是它不会加载图像,当我尝试检查元素时,它会被卡住,因为转换后的byte数组返回了一个很长的string(总结为大约650k字符)。

这是我的MSImage课程:

public class MSImage
{
    public static byte[] ConvertToByte(FileUpload hpf)
    {
        try
        {
            if (hpf.HasFile)
            {
                Stream fs = hpf.PostedFile.InputStream;
                BinaryReader br = new BinaryReader(fs);
                Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                return bytes;
            }
        }
        catch { }
        return null;
    }

    public static string ConvertToImage(byte[] imagedata)
    {
        try
        {
            if (imagedata != null && imagedata.Length > 0)
                return Convert.ToBase64String(imagedata);
        }
        catch { }
        return null;
    }
}

我是以错误的方式保存图像还是导致问题的加载?

编辑:

我刚刚发现这段代码就是问题:

takzir2.InnerHtml = "<div class='msbgimage' style=\"background-image:url(data:" + (string)ms[Database.MSImageType] + ";base64, " + imagedata + ")\"></div>";

我尝试使用div runat="server"并使用div.Style["background-image"],但我如何才能使用InnerHtml

2 个答案:

答案 0 :(得分:1)

我使用以下代码转换我的图片,也许你发现了差异......

static string Image2Base64(Image image)
{
    using (MemoryStream ms = new MemoryStream())
    {
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        byte[] imageBytes = ms.ToArray();
        string base64String = Convert.ToBase64String(imageBytes);
        return base64String;
    }
}

static Bitmap Base642Image(string base64image)
{
    try
    {
        byte[] imageBytes = Convert.FromBase64String(base64image);
        MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
        ms.Write(imageBytes, 0, imageBytes.Length);
        Bitmap image = (Bitmap)Image.FromStream(ms, true);
        return image;
    }
    catch { return null; }
}

我希望这可以帮助你...

答案 1 :(得分:0)

我刚刚找到了解决方案(虽然这是一个愚蠢的解决方案):

这行代码导致了问题:

takzir2.InnerHtml = "<div class='msbgimage' style=\"background-image:url(data:" + (string)ms[Database.MSImageType] + ";base64, " + imagedata + ")\"></div>";

我改变了它的结尾:

";base64, " + imagedata + ")\"></div>";

要:

";base64," + imagedata + ")\"></div>";

";base64,"imagedata之间的空格导致了它,因为InnerHtml没有用%20替换空格字符。