2016-09-07 8 views
0

Я работаю над компонентом serveride webapp, который должен отображать изображения, хранящиеся в базе данных.Подавать файл в байте [] как URL-адрес

Я пытаюсь найти способ преобразования байтового массива или потока в действительный URL для тега HTML img.

Байт [] содержит весь файл, включая заголовки.

Я искал решение, но я продолжал искать обратную проблему сохранения в filestream с URL-адреса.

Есть ли способ обслуживать файл через какой-то динамически сгенерированный URL-адрес или мне нужно создать физическую копию файла для ссылки?

ответ

0

Вы можете преобразовать байт-массив в образ Base64.

public string getBase64Image(byte[] myImage) 
    { 
     if (myImage!= null) 
     { 
      return "data:image/jpeg;base64," + Convert.ToBase64String(myImage); 
     } 
     else 
     { 
      return string.Empty; 
     } 
    } 

Тег изображение будет выглядеть следующим образом: <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgA...">

Или для больших изображений (и других типов файлов), это лучше использовать Generic Handler

public void ProcessRequest(HttpContext context) 
    { 
     //check if the querystring 'id' exists 
     if (context.Request.QueryString["id"] != null) 
     { 
      string idnr = context.Request.QueryString["id"].ToString(); 

      //check if the id falls withing length parameters 
      if (idnr.Length > 0 && idnr.Length < 40) 
      { 
       //get the data from the db or other source 
       byte[] bin = getMyDataFromDB(); 

       //clear the headers 
       context.Response.ClearHeaders(); 
       context.Response.ClearContent(); 
       context.Response.Clear(); 
       context.Response.Buffer = true; 

       //if you do not want the images to be cached by the browser remove these 3 lines 
       context.Response.Cache.SetExpires(DateTime.Now.AddMonths(1)); 
       context.Response.Cache.SetCacheability(HttpCacheability.Public); 
       context.Response.Cache.SetValidUntilExpires(false); 

       //set the content type and headers 
       context.Response.ContentType = "image/jpeg"; 
       context.Response.AddHeader("Content-Disposition", "attachment; filename=\"myImage.jpg\""); 
       context.Response.AddHeader("content-Length", bin.Length.ToString()); 

       //write the byte array 
       context.Response.OutputStream.Write(bin, 0, bin.Length); 

       //cleanup 
       context.Response.Flush(); 
       context.Response.Close(); 
       context.Response.End(); 
      } 
     } 
    } 

Ваш тег изображения будет выглядеть следующим образом : <img src="/Handler1.ashx?id=AB-1234">

+0

Я понятия не имел, что вы можете вставлять изображение в тег src! Я попробую это сразу. – rxj

+2

Обратите внимание, что преобразование в Base64 создаст большую строку. Обычно я не использую первый метод с изображениями размером более 50 кб. – VDWWD

+0

@VDWWD Не нужно создавать обработчик ashx: ваш код, служащий изображением в качестве байта [] (второе решение), будет работать на странице_страницы() обычной страницы getimage.aspx - просто замените 'context.' на' this. '(или ничего) –