第27天:实作档案上传功能(4)

昨天我们建立一个File资料表要来储存档案实体路径

CREATE TABLE [dbo].[File]
(
	[Id] CHAR(36) NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(50) NOT NULL
)

接下来我们要对Product资料表进行修改,加个栏位储存图片FileID,并对File资料表做关联

ALTER TABLE [dbo].[Product] ADD [FileId] CHAR (36);
ALTER TABLE [dbo].[Product] ADD FOREIGN KEY ([FileId]) REFERENCES [dbo].[File](Id); 

修改完後,再一次执行我们的EF Core反向工具,重新建立资料库模型。

Scaffold-DbContext "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=AspCoreIThelp2020;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" -OutputDir Models  Microsoft.EntityFrameworkCore.SqlServer -Force

现在我们新增档案的Action就要做多个步骤,储存档案、对File资料表做写入、对Product资料表做写入

[HttpPost]
public async Task<IActionResult> AddProduct(AddProductViewModel productViewModel)
{
    if (ModelState.IsValid)
    {
        //取得使用者上传档案的原始档名
        var fileOriginName = Path.GetFileName(productViewModel.File.FileName);
        //取原始档名中的副档名
        var fileExt = Path.GetExtension(fileOriginName);
        //为避免使用者上传的档案名称发生重复,重新给一个乱数名称
        var fileNewName = Path.GetRandomFileName();
        //指定要写入的路径、档名和副档名
        var filePath = "/data/" + fileNewName + fileExt;

        //将使用者上传的档案写入到指定路径
        await using (var stream = System.IO.File.Create(filePath))
        {
            //执行写入
            await productViewModel.File.CopyToAsync(stream);
        }
        var file = new Models.File()
        {
            Id = Guid.NewGuid().ToString(),
            Name = fileNewName + fileExt
        };


        var last = _context.Product.OrderByDescending(d => d.Id).FirstOrDefault();
        var product = new Product()
        {
            Id = last.Id + 1,
            Name = productViewModel.Name,
            FileId = file.Id
        };

        _context.File.Add(file);

        _context.Product.Add(product);
        _context.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(productViewModel);
}

<<:  Day27 | 导入WebviewPanel

>>:  第二十七天:UI切版 & 元件-按钮元件、常用的表单元件

[Day 22] 针对API的单元测试(二)

我们昨天已经测试了一个Json的API, 那我们今天将测试方法改成这样 public functio...

Day 2 : HTML - 给我去刻个网站!之 我干了件蠢事

事情是这样的 大一下学期时,学长丢了一个网站 叫我一样画葫芦刻出来 只要版面配置相像就好,图片、功能...

[day 19] 在网页端学Swift 以及 SwiftUI入门

发现一个可以在网页端学 Swift的地方-->google colab A Swift Tou...

[Day 16] 以 Programmatic 取代 Annotation 的方式撰写 OpenAPI 文件

Spring Boot 使用 Annotation 撰写 OpenAPI Definition 我们...

[第20天]理财达人Mx. Ada-Telegram Bot-echo测试

前言 本文说明使用Python建立Telegram Bot-echo测试 。 程序实作 from t...