【问题标题】:Upload files in ASP.Core: How to store the binary file in the database table, using Dapper to insert dataASP.Core中上传文件:如何将二进制文件存储在数据库表中,使用Dapper插入数据
【发布时间】:2021-07-21 20:05:11
【问题描述】:

我正在 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 中有一个名为“文件”的字段或类似的内容来上传文件,并且数据库将接受文件名和文件的二进制数据。对于我的 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; } 
    }

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

【问题讨论】:

  • 旁注:QueryFirstAsync / QuerySingleAsync 可能对你有用——你可能不需要DynamicParameters
  • 我包含了一个使用 byte[] 的参数,谢谢。现在,下一个问题是邮递员不喜欢同时发送文件上传的表单数据和 API 其余部分的原始 json ......有人知道如何混合这两个吗?

标签: c# sql api asp.net-core dapper


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2017-03-03
    • 2017-09-06
    相关资源
    最近更新 更多