实现存储和读取数据库图片的完整攻略需要以下步骤:
- 创建数据库表格
需要创建一个数据库表来存储图片,这个表至少需要包含以下两个字段:
- ImageId:图片ID,为主键自增长;
- ImageData:图片二进制数据,以byte[]类型存储。
例如:
CREATE TABLE [dbo].[Images] (
[ImageId] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[ImageData] VARBINARY(MAX) NOT NULL
)
- 编写asp.net页面
页面需要包含两个页面,分别是上传页面和展示页面。
2.1 上传页面
上传页面需要包含以下步骤:
- 创建上传表单;
- 在上传表单中使用 input:file元素,允许用户选择要上传的图片;
- 当用户点击提交按钮时,将图片数据以二进制形式传递给服务器。
例如:
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit">上传图片</button>
</form>
2.2 展示页面
展示页面需要从数据库中读取图片数据,并将其显示在页面上。
例如:
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("SELECT ImageData FROM Images WHERE ImageId = @ImageId", connection);
command.Parameters.AddWithValue("@ImageId", imageId);
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
var imageData = (byte[])reader["ImageData"];
Response.ContentType = "image/jpeg";
Response.BinaryWrite(imageData);
}
}
}
以上代码会生成一个HTTP响应,其中文件类型为JPEG,文件内容为读取自数据库的图片数据(byte[])。
示例1:
我们可以使用System.Drawing
库将图片数据转换为图片对象(pictureBox)。添加以下代码将图片显示在上传页面上。
if (Request.Files.Count > 0)
{
var file = Request.Files[0];
var fileName = Path.GetFileName(file.FileName);
var imageData = new byte[file.InputStream.Length];
file.InputStream.Read(imageData, 0, imageData.Length);
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("INSERT INTO Images (ImageData) VALUES (@ImageData); SELECT CAST(scope_identity() AS int)", connection);
command.Parameters.AddWithValue("@ImageData", imageData);
var imageId = (int)command.ExecuteScalar();
using (var memoryStream = new MemoryStream(imageData))
{
var image = Image.FromStream(memoryStream);
pictureBox.Image = image;
}
}
}
示例2:
我们可以使用Gridview控制在展示页面上展示多个图片。
protected void Page_Load(object sender, EventArgs e)
{
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("SELECT ImageId FROM Images", connection);
using (var reader = command.ExecuteReader())
{
var imageIds = new List<int>();
while (reader.Read())
{
imageIds.Add((int)reader["ImageId"]);
}
GridView1.DataSource = imageIds;
GridView1.DataBind();
}
}
}
在GridView的TemplateField当中嵌入控件,如下代码
<asp:GridView ID="GridView1" runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# "/ImageHandler.ashx?ImageId=" + Eval("ImageId") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
并且需要添加一个HttpHandler(ashx)用于将图片数据以二进制形式传递给客户端。
public class ImageHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var imageId = int.Parse(context.Request.QueryString["ImageId"]);
var connectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var command = new SqlCommand("SELECT ImageData FROM Images WHERE ImageId = @ImageId", connection);
command.Parameters.AddWithValue("@ImageId", imageId);
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
var imageData = (byte[])reader["ImageData"];
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(imageData);
}
}
}
}
public bool IsReusable => false;
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net实现存储和读取数据库图片 - Python技术站