0

我制作了这个控制器,用于在 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 获取数据并将其一直发送到门户网站和用户的浏览器以及文件下载。

4

0 回答 0