ASP Web API方法添加文件上传功能并直接存库的实现方案咨询
最优整合方案说明
核心思路是直接移除本地文件存储逻辑,将上传拿到的IFormFile对象信息直接对接已有数据库写入逻辑即可,无需修改现有表结构,同时修正原有代码的SQL注入风险,具体实现如下:
整合后完整代码示例
// 入参说明:claimID为当前业务关联的索赔单ID,files为接口接收的上传文件集合(对应Postman上传的文件) var result = new List<FileUploadResult>(); foreach (var file in files) { // 移除原有写入webroot路径的逻辑,直接写入数据库 var parameters = new DynamicParameters(); parameters.Add("filename", file.FileName); var filemessage = await _sqlconnection.QueryAsync<int>(@" INSERT INTO [dbo].[OptionalFile] ([FileName]) VALUES (@filename); SELECT SCOPE_IDENTITY();", parameters); int FileMessageID = filemessage.First(); // 修正原SQL拼接的注入风险,改用参数化写入关联表 var crossParams = new DynamicParameters(); crossParams.Add("ClaimID", claimID); crossParams.Add("FileID", FileMessageID); await _sqlconnection.QueryAsync<int>(@" INSERT INTO [dbo].[ClaimCrossOptionalFile] (ClaimID,FileID) VALUES (@ClaimID, @FileID);", crossParams); // 保留返回结果,符合原有接口出参格式 result.Add(new FileUploadResult() { filename = file.FileName, Length = file.Length }); }
Postman测试步骤
- 新建POST请求,填写你的接口地址
- 切换到「Body」标签,选择
form-data格式 - Key列填写接口接收文件的参数名,鼠标悬停在Key输入框右侧,下拉选择类型为
File - Value列点击「Select Files」可批量选择需要上传的文件
- 发送请求即可完成文件名直接入库,不会生成本地存储的文件
可选优化点
- 新增事务包裹循环逻辑,避免部分文件写入成功、部分失败导致的数据不一致
- 新增文件名重复校验,可根据业务规则对重名文件做重命名处理
- 如果后续需要存储文件本身而非仅存文件名,可在
OptionalFile表新增FileContent字段(类型为varbinary(max)),直接将IFormFile的流转为字节数组存入该字段即可
内容的提问来源于stack exchange,提问作者user16251376
相关产品推荐
相关产品推荐

