如何显示从HTML中数据库返回的SQL Server FileStream .jpg映像



我正在尝试检索存储在SQL Server中的JPEG文件,并使用img src =" filepath"将其显示在HTML中图像,这只是在其中显示一个带有X的微小图像框。
如何将图像直接显示为图像变量。这是带有剃须刀C#的HTML页面:

@{ 
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;
      }
  }
}

尝试找到答案三天后,以下工作有效。摘要,一旦从数据库SQLFileStream代码返回iPhotoImage后,使用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">

付出了更多努力后,我发现我无法保存到jpeg图像的内存流中。这给出了普遍存在的总GDI错误。jpeg文件必须首先使用以下代码转换为BITMP图像,然后才能显示它们:

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

另一个注意事项:JPEG文件作为位图的图像类型从SQL FileStream返回,这是我引起我尝试与@Amir Atasin的条目一起尝试的:GDI ,JPEG Image中发生了一个通用错误memorystream

最新更新