Как представить файл потока файлов SQL .jpg, возвращенный из базы данных в HTML - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь извлечь jpeg-файлы, хранящиеся в SQL Server, и представить их в формате html, используя img src = "filepath", но мой код C # возвращает фактическое изображение, а не URL-путь к изображению, и это просто отображает крошечное изображениеполе с буквой х.
Как я могу отобразить изображение непосредственно как переменную изображения.Вот HTML-страница с Razor C #:

@{ 
int iFileID = 8;
string sPhotoDesc = "";
Image iPhotoImage = null;
}
<form>

<fieldset>
    <legend>FileInput</legend>
    <input type="file" id="fileinput" />
    <input type='button' id='btnLoad' value='Load' onclick="@{iPhotoImage = 
         PhotoLibraryApp.PhotoData.SelectPhoto(iFileID, out sPhotoDesc); }">
    <div id="editor"></div>
</fieldset>

<img src="@iPhotoImage" width="500" height="377">

Вот соответствующий код C # в отдельном файле PhotoData.cs:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Drawing;
using System.IO;
using System.Transactions;


namespace PhotoLibraryApp
{
    public class PhotoData
    {
        private const string ConnStr =
          "Data Source=.;Integrated Security=True;Initial                                   
                               Catalog=PhotoLibrary;";

     public static Image SelectPhoto(int photoId, out string desc)
      {
        const string SelectTSql = @"
        SELECT
        Description,
        Photo.PathName(),
        GET_FILESTREAM_TRANSACTION_CONTEXT()
      FROM PhotoAlbum
      WHERE PhotoId = @PhotoId";

        Image photo;
        string serverPath;
        byte[] serverTxn;

        using (TransactionScope ts = new TransactionScope())
        {
            using (SqlConnection conn = new SqlConnection(ConnStr))
            {
                conn.Open();

                using (SqlCommand cmd = new SqlCommand(SelectTSql, conn))
                {
                    cmd.Parameters.Add("@PhotoId", SqlDbType.Int).Value = photoId;

                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    {
                        rdr.Read();
                        desc = rdr.GetSqlString(0).Value;
                        serverPath = rdr.GetSqlString(1).Value;
                        serverTxn = rdr.GetSqlBinary(2).Value;
                        rdr.Close();
                    }
                }
                photo = LoadPhotoImage(serverPath, serverTxn);
            }

            ts.Complete();
        }

        return photo;
    }

    private static Image LoadPhotoImage(string filePath, byte[] txnToken)
    {
        Image photo;

        using (SqlFileStream sfs =
          new SqlFileStream(filePath, txnToken, FileAccess.Read))
        {
            photo = Image.FromStream(sfs);
            sfs.Close();
        }

        return photo;
      }

  }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

После дополнительных усилий я обнаружил, что не могу сохранить в памяти поток для изображений JPEG.Это дало повсеместную общую ошибку GDI.Файлы JPEG должны были быть сначала преобразованы в растровые изображения с использованием следующего кода, прежде чем я смог их отобразить:

(var ms = new MemoryStream())
{
    Bitmap bmp = new Bitmap(imageToConvert);
    bmp.Save(ms, format);
    return ms.ToArray();
}

Еще одно примечание: файлы JPEG возвращаются из потока файлов SQL как тип изображения Bitmap,это было то, что подсказало мне попробовать это вместе с записью @Amir Atasin здесь: Произошла общая ошибка в GDI +, JPEG Image to MemoryStream

0 голосов
/ 27 апреля 2018

После попытки найти ответ в течение 3 дней сработало следующее.Резюме: после того, как iPhotoImage возвращается из кода SQLFilestream базы данных, он затем преобразуется в байтовый массив с помощью TurnImageToByteArray, а затем байты imgBytes конвертируются в строку imgString, которая отображает изображение в HTML.Вот дополнительные фрагменты кода:

@{
//Get the file ID you want to display
int iFileID = 8;
string sPhotoDesc = "";
Image iPhotoImage = null;

iPhotoImage = PhotoLibraryApp.PhotoData.SelectPhoto(iFileID, out 
sPhotoDesc);

byte[] imgBytes = 
PhotoLibraryApp.PhotoData.TurnImageToByteArray(iPhotoImage);
string imgString = Convert.ToBase64String(imgBytes);

}

Я добавил следующий метод в свой класс PhotoData:

  public static byte[] TurnImageToByteArray(Image img)
    {
        MemoryStream ms = new MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        return ms.ToArray();
    }

Ниже приведен HTML-код для отображения изображения:

 <img id="JpegImage" alt="Photo Alternative" src="data:image/jpeg;base64, @imgString">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...