Member 11183217 Ответов: 2

Проверьте тип строки base64(image) с помощью C#


привет,

На самом деле в моем приложении у меня есть функция загрузки изображений, там я передал один параметр(base64string) своему контроллеру. здесь я хочу проверить тип base64string . я попробовал один способ, но это было неправильно, если кто-нибудь знает, пожалуйста, скажите мне этот ответ .


мне нужно изменить эту линию . как проверить тип внутри этой строки ,

string x = base64image.Replace("data:image/png|tiff|jpg|gif;base64,", "");


Что я уже пробовал:

public bool LoadImage([FromBody]string base64image)
      {
          string x = base64image.Replace("data:image/png|tiff|jpg|gif;base64,", "");
          byte[] data = System.Convert.FromBase64String(x);
          MemoryStream ms = new MemoryStream(data);
          Image img = Image.FromStream(ms);
          return false;
      }

2 Ответов

Рейтинг:
17

Richard Deeming

Используйте регулярное выражение:

using System;
using System.Drawing;
using System.IO;
using System.Text.RegularExpressions;

public sealed class DataImage
{
    private static readonly Regex DataUriPattern = new Regex(@"^data\:(?<type>image\/(png|tiff|jpg|gif));base64,(?<data>[A-Z0-9\+\/\=]+)$", RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
    
    private DataImage(string mimeType, byte[] rawData)
    {
        MimeType = mimeType;
        RawData = rawData;
    }
    
    public string MimeType { get; }
    public byte[] RawData { get; }
    
    public Image Image => Image.FromStream(new MemoryStream(RawData));
    
    public static DataImage TryParse(string dataUri)
    {
        if (string.IsNullOrWhiteSpace(dataUri)) return null;
        
        Match match = DataUriPattern.Match(dataUri);
        if (!match.Success) return null;
        
        string mimeType = match.Groups["type"].Value;
        string base64Data = match.Groups["data"].Value;
        
        try
        {
            byte[] rawData = Convert.FromBase64String(base64Data);
            return rawData.Length == 0 ? null : new DataImage(mimeType, rawData);
        }
        catch (FormatException)
        {
            return null;
        }
    }
}

public bool LoadImage([FromBody] string base64image)
{
    DataImage image = DataImage.TryParse(base64image);
    if (image == null) return false;
    
    Image img = image.Image;
    // Do something with the image...
    return true;
}

Язык Регулярных Выражений - Краткая Справка[^]


Member 11183217

Большое вам спасибо, Ричард, я получил d фактическую функциональность из-за вашей идеи

Рейтинг:
1

Member 14533119

Изменил код Ричарда. TryParse возвращает bool и добавляет imageType, потому что я не вижу использования для mimeType

public sealed class DataImage
    {
        private static readonly Regex DataUriPattern = new Regex(@"^data\:(?<mimeType>image\/(?<imageType>png|tiff|jpg|gif));base64,(?<data>[A-Z0-9\+\/\=]+)$", RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);

        private DataImage(string mimeType, string imageType, byte[] rawData)
        {
            MimeType = mimeType;
            RawData = rawData;
            ImageType = imageType;
        }

        public string MimeType { get; }
        public byte[] RawData { get; }
        public string ImageType { get; }

        public Image Image => Image.FromStream(new MemoryStream(RawData));

        public static bool TryParse(string dataUri, out DataImage image)
        {
            image = null;
            if (string.IsNullOrWhiteSpace(dataUri)) return false;

            Match match = DataUriPattern.Match(dataUri);
            if (!match.Success) return false;

            string mimeType = match.Groups["mimeType"].Value;
            string imageType = match.Groups["imageType"].Value;
            string base64Data = match.Groups["data"].Value;

            try
            {
                byte[] rawData = Convert.FromBase64String(base64Data);
                image = rawData.Length == 0 ? null : new DataImage(imageType, rawData);
                return true;
            }
            catch (FormatException)
            {
                return false;
            }
        }
    }


использование:

if (DataImage.TryParse(propertyValue, out var imageData))
{
    picture = imageData.RawData;
}