如何在ASP.NET中实现数据库图片的存储与检索?

### ASP.NET 数据库图片处理详解

在ASP.NET应用程序中,处理和存储图片通常涉及将图片数据保存到数据库中,本文将详细介绍如何在ASP.NET中实现这一功能,包括前端页面设计、后端代码编写以及数据库操作,我们将使用C#作为编程语言,并采用Entity Framework进行数据库操作。

#### 1. 创建ASP.NET项目

创建一个新的ASP.NET Web应用程序项目,在Visual Studio中,选择“新建项目”,然后选择“ASP.NET Web应用程序”,在模板选择界面,选择“空”模板,并确保选中“MVC”复选框,点击“创建”按钮,完成项目创建。

#### 2. 配置数据库

我们需要配置数据库,在本例中,我们将使用SQL Server作为数据库,创建一个名为`ImagesDB`的数据库,并在其中创建一个表来存储图片信息。

```sql

CREATE DATABASE ImagesDB;

USE ImagesDB;

CREATE TABLE Images (

Id INT PRIMARY KEY IDENTITY,

Name NVARCHAR(50),

ImageData VARBINARY(MAX)

);

```

#### 3. 添加模型和数据库上下文

在项目中添加一个模型类`Image`,用于表示图片实体,添加一个数据库上下文类`ApplicationDbContext`,用于与数据库进行交互。

**Image.cs

```csharp

public class Image

public int Id { get; set; }

public string Name { get; set; }

public byte[] ImageData { get; set; }

```

**ApplicationDbContext.cs

```csharp

using Microsoft.EntityFrameworkCore;

public class ApplicationDbContext : DbContext

public DbSet Images { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

{

optionsBuilder.UseSqlServer("YourConnectionStringHere");

}

```

#### 4. 创建控制器和视图

创建一个控制器`ImagesController`,用于处理图片的上传和显示,创建一个视图`Index.cshtml`,用于展示上传表单和图片列表。

**ImagesController.cs

```csharp

using Microsoft.AspNetCore.Mvc;

using System.IO;

using System.Threading.Tasks;

using Microsoft.EntityFrameworkCore;

public class ImagesController : Controller

private readonly ApplicationDbContext _context;

public ImagesController(ApplicationDbContext context)

{

_context = context;

}

public async Task Index()

{

return View(await _context.Images.ToListAsync());

}

[HttpPost]

public async Task Index(IFormFile file)

{

if (file != null && file.Length > 0)

{

var image = new Image();

using (var stream = new MemoryStream())

{

await file.CopyToAsync(stream);

image.ImageData = stream.ToArray();

image.Name = Path.GetFileNameWithoutExtension(file.FileName);

await _context.Images.AddAsync(image);

await _context.SaveChangesAsync();

}

}

return RedirectToAction("Index");

}

```

**Index.cshtml

```html

@model IEnumerable

Upload Image

Uploaded Images

    @foreach (var image in Model)

  • @image.Name

    @image.Name

```

#### 5. 添加API以获取图片数据

为了在网页上显示图片,我们需要添加一个API端点,用于从数据库中检索图片数据并将其作为二进制流返回给客户端。

**ImagesController.cs(续)

```csharp

[HttpGet("GetImage/{id}")]

public async Task GetImage(int id)

var image = await _context.Images.FindAsync(id);

if (image == null) return NotFound();

return File(image.ImageData, "image/jpeg"); // 根据实际文件类型调整MIME类型

```

#### 6. 运行应用程序

您可以运行应用程序并测试图片上传和显示功能,访问`http://localhost:/Images/Index`,您将看到一个上传表单和一个已上传图片的列表,上传一张图片后,它应该会显示在列表中,并且可以通过点击其名称查看图片。

### 问题与解答

**问题1:如何更改图片的MIME类型?

答:在`GetImage`方法中,第二个参数是MIME类型,根据您上传的图片类型,您可以将其更改为`image/png`、`image/gif`等,如果您知道上传的是PNG图片,可以这样修改:

```csharp

return File(image.ImageData, "image/png");

```

**问题2:如何处理大文件上传?

答:对于大文件上传,您可以考虑以下几种方法:

**增加服务器的文件大小限制**:在`web.config`或`Startup.cs`中增加允许的最大请求大小,在ASP.NET Core中,可以在`Program.cs`中添加:

```csharp

.UseKestrel(options =>

{

options.Limits.MaxRequestBodySize = 10485760; // 10 MB

})

```

**分片上传**:将大文件分割成多个小片段上传,然后在服务器端重新组装,这可以减少每次上传的数据量,提高成功率,可以使用第三方库如`Resumable.js`来实现前端分片上传。

以上内容就是解答有关“asp.net 数据库图片”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。