c# - 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; }
}
我坚持的是如何继续,以便能够将文件名和二进制文件数据存储在数据库中。(我正在使用邮递员发布数据)。我对如何进行的想法持开放态度,如果有人有的话。
解决方案
您可以通过 dapper 存储 blob,只需包含一个带类型的参数byte[]
(并将其包含在insert
. 如果问题是文件特别大(使大byte[]
不合适),那么您可能需要循环并附加块+
,像这样
推荐阅读
- python - 转置数据框并处理列名
- excel - 通过 Excel VBA 在 Outlook 中编辑书签
- matlab - 如何根据另一列中的更改更改矩阵中列的元素?
- r - 将多行合并为一行并在 R 中删除 NA
- python - 解码 CSV 文件
- c# - 单元测试中的 HostBuilder:HostContext.Configuration.GetSection 返回值 null
- drupal - 无法在 drupal 8 中以编程方式创建用户
- java - 匹配以逗号分隔的多个带引号的字符串的严格语法
- excel - VBA:将超链接复制到剪贴板
- dart - 以前添加 Stream 值以在侦听时返回(广播流)