Сохранить BLOB на диск как изображение C # - PullRequest
1 голос
/ 29 апреля 2010

Я занимаюсь разработкой веб-приложения, которое вызывает веб-службы, разработанные третьей стороной, для отправки / получения данных из клиентской базы данных. Я создаю приложение, используя ASP.NET 3.5 C #.

Способ, которым они предоставляют мне изображения, находится в формате BLOB. Я называю их метод, и в ответ я получаю DataSet с двумя полями "logo_name" и "logo", который является полем BLOB. Что я хочу сделать, это: сохранить изображение локально на диске (чтобы свести к минимуму количество обращений к их базе данных в будущем).

Я поиграл с несколькими различными способами сделать это, но, похоже, не могу правильно сохранить изображение. Мне удалось создать файл в папке с правильным именем, но если я пытаюсь просмотреть изображение, оно не работает.

Я надеялся, что кто-нибудь может дать мне пример кода, чтобы показать, как сохранить поле BLOB на локальный диск?

Вот код, который у меня сейчас есть

public static class ProductImages
    {


        public static string GetSchoolLogo(string schoolID, string printCodeID)
        {
            int v_length = 0;
            string v_file_name = "";
            byte[] v_file_data = null;

            try
            {

                //Declare Web Service Variables
                P_SERVICE.Service ldeService = new P_SERVICE.Service();
                //Authentication Header
                ldeService.AuthHeaderValue = CGlobal.GetAuthHeader(System.Web.HttpContext.Current.Session);
                P_SERVICE.CDataResultOfDataSet ldeResult = null;
                DataSet ds = new DataSet();

                ldeResult = ldeService.GetItemLogo(schoolID, printCodeID);
                ds = ldeResult.Value;

                if (ds.Tables[0].Rows.Count > 0)
                {
                    v_file_data = StrToByteArray(ds.Tables[0].Rows[0]["logo"].ToString().TrimEnd());
                    v_file_name = ds.Tables[0].Rows[0]["logo_name"].ToString().TrimEnd();
                    v_length = Convert.ToInt32(v_file_data.Length);

                    // Load the file in the Memory Stream
                    MemoryStream ms = new MemoryStream(v_file_data, 0, v_file_data.Length);
                    ms.Write(v_file_data, 0, v_file_data.Length);

                    // Open the file stream in ordre to save on the local disk
                    string path = HttpContext.Current.Server.MapPath("~/_imagecache/schoolLogos/").ToString();
                    FileStream fs = File.OpenWrite(path + schoolID + "/" + v_file_name);
                    fs.Write(v_file_data, 0, v_file_data.Length);
                    fs.Close();

                    // Return True if no errors occured
                    return "~/_imagecache/schoolLogos/" + schoolID + "/" + v_file_name;
                }
                else
                    return "~/images/noPhoto.gif";

           }

            catch (Exception ex)
            {

                throw new Exception(ex.Message.ToString());
                //return "~/images/noPhoto.gif";
            } 
        }

        // C# to convert a string to a byte array.
        public static byte[] StrToByteArray(string str)
        {
            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
            return encoding.GetBytes(str);
        }
    }


}

Когда я получаю тип возвращаемых данных, он возвращает System.String

Type t = ds.Tables[0].Rows[0]["logo"].GetType();
HttpContext.Current.Trace.Warn(t.FullName);

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 апреля 2010

Ваша линия:

v_file_data = StrToByteArray(ds.Tables[0].Rows[0]["logo"].ToString().TrimEnd()); 

Должно быть действительно:

v_file_data = ds.Tables[0].Rows[0]["logo"] as Byte[];

Используемый вами метод не будет кодировать и декодировать байты одинаково.

1 голос
/ 29 апреля 2010

Хорошо, похоже, веб-служба не оказывает вам никакой помощи. Они действительно должны возвращать байтовый массив. но в любом случае строка определенно не base64 и определенно не ascii.

Давайте попробуем этот дикий удар в темноте:

v_file_data = Encoding.UTF8.GetBytes(ds.Tables[0].Rows[0]["logo"]);
0 голосов
/ 29 апреля 2010

Попробуйте это:

// replace this line:
//v_file_data = StrToByteArray(ds.Tables[0].Rows[0]["logo"].ToString().TrimEnd());

// with this block:
string base64string = ds.Tables[0].Rows[0]["logo"] as string;

if (base64string != null)
{
    v_file_data = System.Convert.FromBase64String(v_file_data);
}

Возьмите байтовый массив и загрузите его в файл, используя оставшуюся часть кода.

НТН ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...