我制作了这个控制器,用于在 Web API 上快速上传和下载文件:
[ApiController]
[Route("api/[controller]")]
[EnableCors("_myAllowSpecificOrigins")]
public class AttachmentController : ControllerBase
{
private readonly IWebHostEnvironment _hostingEnvironment;
private readonly IBudgetReleaseRequestService _mainService;
public AttachmentController(IWebHostEnvironment hostingEnvironment, IBudgetReleaseRequestService mainService)
{
_hostingEnvironment = hostingEnvironment;
_mainService = mainService;
}
[HttpPost]
[Route("UploadFile")]
public async Task<ActionResult> UploadFile()
{
try
{
var dictionary = Request.Form.ToDictionary(x => x.Key, x => x.Value.ToString());
var brrAttachment = Request.Form.Files["brrAttachments"];
if (!dictionary.TryGetValue("RequestId", out var requestIdentifier))
{
Response.StatusCode = 400;
return new EmptyResult();
}
if (brrAttachment == null)
{
Response.StatusCode = 400;
return new EmptyResult();
}
var fileName = Path.GetFileName(brrAttachment.FileName);
var fileExtension = Path.GetExtension(fileName);
var fileMiscPmDto = new RequestFileAttachmentDto
{
RequestIdentifier = Guid.Parse(requestIdentifier),
FileName = fileName,
FileExtension = fileExtension
};
await using (var target = new MemoryStream())
{
await brrAttachment.CopyToAsync(target);
fileMiscPmDto.FileData = target.ToArray();
}
await _mainService.AssociateFile(fileMiscPmDto);
}
catch
{
Response.StatusCode = 400;
}
return new EmptyResult();
}
[HttpGet("{id}")]
public async Task<IActionResult> Download(string id)
{
Stream stream = await { { __get_stream_based_on_id_here__} }
if (stream == null) return NotFound();
return new FileStreamResult(stream, "application/octet-stream");
}
}
这是洋葱管道的结束:
public async Task AssociateFile(RequestFileAttachmentDto fileMiscPmDto)
{
var newAttach = new RequestFileAttachment
{
RequestIdentifier = fileMiscPmDto.RequestIdentifier,
FileName = fileMiscPmDto.FileName,
FileExtension = fileMiscPmDto.FileExtension,
FileData = fileMiscPmDto.FileData,
CreatedTimestamp = DateTime.Now
};
await _context.RequestFileAttachments.AddAsync(newAttach);
await _context.SaveChangesAsync();
}
public async Task DownloadFile(Guid fileId)
{
}
我的前端是一个连接到此 Web API 的 Blazor 服务器端项目。我可以正常上传文件。我不明白我该如何下载它们。这些文件byte[]坐在桌子上。我想使用 SQL FileStreaming,但在我的企业环境中不允许使用网络共享方式访问文件以进行读取/下载。所以我搜索的问题是从某个位置获取文件,而不是从表中获取数据。
此外,在我上面的 Web API 控制器中,SO 建议返回一个流。我需要帮助来弄清楚如何从 SQL Server 获取数据并将其一直发送到门户网站和用户的浏览器以及文件下载。