Jpeg到字节数组,而转换逻辑在if语句内

本文关键字:if 语句 转换 到字节 数组 Jpeg | 更新日期: 2023-09-27 17:53:25

我相信这是一个非常简单的问题,即使是没有经验的开发人员也能做到,但我只是刚刚开始。

我在逻辑上放了一个if语句来将jpeg转换为字节数组,这样除非选择了文件,否则转换不会发生。但这使得变量logoBytes对数据参数不可见。一位同事告诉我,我必须将转换的逻辑放入一个方法中,然后在某个地方引用该方法,但我仍然相当困惑。

        protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Div1.Visible = true;
if (logoPrvw.Value != null)
{ 
    System.Drawing.Image img = System.Drawing.Image.FromFile(logoPrvw.Value);
    byte[] logoBytes;
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        logoBytes = ms.ToArray();
    }
}
TemplateData data = new TemplateData(txtSchemeCode.Text, txtVersion.Text, txtComment.Text, txtTemplateId.Text, logoBytes);
                if (ddSchemeCode.SelectedIndex == 0)
                {
                    lblCreated.Visible = true;
                    lblUpdated.Visible = false;
                    DataClass.addNewSchemeCode(data);
                }
                if (ddSchemeCode.SelectedIndex == 0 && ddVersion.SelectedIndex != 0)
                {
                    lblCreated.Visible = true;
                    lblUpdated.Visible = false;
                    DataClass.addNewVersion(data);
                }
                if (ddSchemeCode.SelectedIndex != 0 && ddVersion.SelectedIndex == 0)
                {
                    lblUpdated.Visible = true;
                    lblCreated.Visible = false;
                    DataClass.UpdateData(data);
                }

这是TemplateData

    public class TemplateData
{
    public byte[] Logo { get; set; }
    public string TemplateId { get; set; }
    public string SchemeCode { get; set; }
    public string Version { get; set; }
    public string Comment { get; set; }
    public TemplateData(string schemeCode, string version, string comment, string templateID, byte[] logo)
    {
        SchemeCode = schemeCode;
        Version = version;
        Comment = comment;
        TemplateId = templateID;
        Logo = logo;
    }
    public TemplateData(SqlDataReader dr)
    {
        initialiseData();
        if (dr.HasRows)
        {
                Version = dr["Version"].ToString();
                Logo = (byte[])dr["Logo"];                 
                TemplateId = dr["TemplateId"].ToString();
                Comment = dr["Comment"].ToString();
                SchemeCode = dr["SchemeCode"].ToString();
        }
    }

Jpeg到字节数组,而转换逻辑在if语句内

如果logoPrvw.Valuenull,您可能不想创建数据对象,也不想使用其余的代码。所以,也许你的解决方案就像这样简单:

if (logoPrvw.Value != null)
    return;
System.Drawing.Image img = System.Drawing.Image.FromFile(logoPrvw.Value);
byte[] logoBytes;
using (MemoryStream ms = new MemoryStream())
{
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    logoBytes = ms.ToArray();
}
TemplateData data = new TemplateData(txtSchemeCode.Text, txtVersion.Text, txtComment.Text, txtTemplateId.Text, logoBytes);
//rest of your code

那么,您需要在if语句之外声明logoBytes变量,以便在创建TemplateData时它仍然在作用域中。如果没有提供文件,您需要决定它应该具有什么值。例如,您可能希望它是null,或者可能是一个空数组。您可以给变量一个初始值,或者使用else子句。例子:

byte[] logoBytes = null;
if (logoPrvw.Value != null)
{
    ...
    // Code that assigns a different value to logoBytes
}
TemplateData data = new TemplateData(..., logoBytes);

或:

byte[] logoBytes;
if (logoPrvw.Value != null)
{
    ...
    // Code that assigns a value to logoBytes
}
else
{
    logoBytes = new byte[0];
}
TemplateData data = new TemplateData(..., logoBytes);

我建议将"work out logoBytes"代码重构为一个单独的方法,因此您将拥有:

byte[] logoBytes = GetLogoBytes(logoPrvw);
TemplateData data = new TemplateData(...);

那么你的GetLogoBytes方法可以像这样:

byte[] GetLogoBytes(HtmlInputFile logoPrvw)
{
    if (logoPrvw.Value == null)
    {
        return null; // Or an empty array, or whatever
    }
    using (Image img = ...)
    {
        using (MemoryStream ms = new MemoryStream())
        {
           img.Save(ms, ImageFormat.Jpeg);
           return ms.ToArray();
        }
    }
}

请注意,您不想使用Image.FromFile -您想使用发布文件中的数据,所以可能是Image.FromStream(logoPrvw.PostedFile.InputStream)