首页 > 解决方案 > ASP.Core中上传文件:如何将二进制文件存储在数据库表中,使用Dapper插入数据

问题描述

我正在 Asp.Core 中构建一个 API,其中会发出不同的请求。其中之一是如果需要,用户应该能够向请求添加一个或多个文件。数据库表创建如下:

CREATE TABLE OptionalFile (
    FileID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    FileName NVARCHAR(100) NOT NULL,
    FileBloB VARBINARY(MAX) NOT NULL,
    CreatedDate DATETIME DEFAULT getdate() NOT NULL,
    CreatedBy NVARCHAR(20) DEFAULT suser_sname() NOT NULL,
    UpdatedDate DATETIME DEFAULT getdate() NOT NULL,
    UpdatedBy NVARCHAR(20) DEFAULT suser_sname() NOT NULL
    );

//cross table 
CREATE TABLE ClaimCrossOptionalFile(
        ClaimID int FOREIGN KEY REFERENCES Claim(ID) NOT NULL,
        FileID int FOREIGN KEY REFERENCES OptionalFile(FileID) NOT NULL,
        CreatedDate DATETIME DEFAULT getdate() NOT NULL,
        CreatedBy NVARCHAR(20) DEFAULT suser_sname() NOT NULL,
        UpdatedDate DATETIME DEFAULT getdate() NOT NULL,
        UpdatedBy NVARCHAR(20) DEFAULT suser_sname() NOT NULL
    );

现在,我只想在 API 中有一个名为“files”的字段或类似的内容来上传文件,并且数据库将接受文件名和文件的二进制数据。对于我的 API 的其余部分,我使用 Dapper 将数据插入数据库。我目前有以下代码用于插入文件名:

if (item.fileuploadresults != null) {

  try {

    foreach(FileUploadResult f in item.fileuploadresults) {
      var parameters = new DynamicParameters();
      parameters.Add("filename", f.filename);

      var filemessage = await _sqlconnection.QueryAsync < int > ($ @ "INSERT INTO 
      [dbo].[OptionalFile] ([FileName])
        VALUES(@filename); SELECT SCOPE_IDENTITY();
        ", parameters);

        int FileMessageID = filemessage.First();

        //update crosstable
        await _sqlconnection.QueryAsync < int > ($ @ "INSERT INTO[dbo].
        [ClaimCrossOptionalFile]
          (ClaimID, FileID) VALUES({
            claimID
          }, {
            FileMessageID
          });
          ");

        }

      }

      catch (Exception ex) {
        int k = 0;
      }

    }

该模型如下所示:

public class FileUploadResult
    {
        public IFormFile files { get; set; } 

        [MaxLength]
        public byte[] FileBlob { get; set; }

        public long Length { get; set; }

        public string filename { get; set; }
    }


 public class Service
    {
        public IList<FileUploadResult> fileuploadresults { get; set; } 
    }

我坚持的是如何继续,以便能够将文件名和二进制文件数据存储在数据库中。(我正在使用邮递员发布数据)。我对如何进行的想法持开放态度,如果有人有的话。

标签: c#sqlapiasp.net-coredapper

解决方案


您可以通过 dapper 存储 blob,只需包含一个带类型的参数byte[](并将其包含在insert. 如果问题是文件特别大(使大byte[]不合适),那么您可能需要循环并附加块+像这样


推荐阅读