C# 如何在SQL Server中检索保存为二进制文件的PDF文件?

C# 如何在SQL Server中检索保存为二进制文件的PDF文件?,c#,sql-server,visual-studio,pdf,asp.net-core,C#,Sql Server,Visual Studio,Pdf,Asp.net Core,我检查了许多关于StackOverflow的问题,也在许多不同的网站上搜索了可能的解决方案,但我似乎没有找到任何答案。有些人不工作,有些人年纪很大,也不工作 我已将.pdf文件以二进制形式保存在SQL Server中。似乎有效。但我不知道如何检索数据,并将字节[]返回到.pdf文件以供下载 这是我的模型,我将.pdf文件保存在字节[]中: public class Language { public int Id { get; set; } public string Name

我检查了许多关于StackOverflow的问题,也在许多不同的网站上搜索了可能的解决方案,但我似乎没有找到任何答案。有些人不工作,有些人年纪很大,也不工作

我已将
.pdf
文件以二进制形式保存在SQL Server中。似乎有效。但我不知道如何检索数据,并将
字节[]
返回到
.pdf
文件以供下载

这是我的模型,我将
.pdf
文件保存在
字节[]
中:

public class Language
{
    public int Id { get; set; }
    public string Name { get; set; }
    public byte[] Certificate { get; set; }
}
这是我上传到数据库的方式:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(string name, IFormFile certificate)
{
    Language language = new Language()
    {
        Name = name
    };

    if(certificate.Length > 0)
    {
        using (var stream = new MemoryStream())
        {
            await certificate.CopyToAsync(stream);
            language.Certificate = stream.ToArray();
        }
    }

    _context.Add(language);
    await _context.SaveChangesAsync();

    return RedirectToAction(nameof(Index));
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建(字符串名称、文件证书)
{
语言=新语言()
{
Name=Name
};
如果(证书长度>0)
{
使用(var stream=new MemoryStream())
{
等待证书。CopyToAsync(流);
language.Certificate=stream.ToArray();
}
}
_添加(语言);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
我希望它能够检索数据,然后下载它


非常感谢您的帮助。

您需要一个操作来返回字节:

public async Task<IActionResult> GetCertificate(int id)
{
    var language = await _context.Languages.FindAsync(id);
    if (language == null)
        return NotFound();

    return File(language.Certificate, "application/pdf");
}
公共异步任务GetCertificate(int-id) { var language=wait_context.Languages.FindAsync(id); if(语言==null) 返回NotFound(); 返回文件(language.Certificate,“application/pdf”); }
然后,您只需链接到此操作。

您需要一个操作来返回字节:

public async Task<IActionResult> GetCertificate(int id)
{
    var language = await _context.Languages.FindAsync(id);
    if (language == null)
        return NotFound();

    return File(language.Certificate, "application/pdf");
}
公共异步任务GetCertificate(int-id) { var language=wait_context.Languages.FindAsync(id); if(语言==null) 返回NotFound(); 返回文件(language.Certificate,“application/pdf”); }
然后,您可以简单地链接到此操作。

当您将pdf文件转换为字节时,您使用的是什么类。我使用的是iFormFile您是指FromFile吗?FromFile包装一个字符串,该字符串将损坏二进制pdf。最好使用byte[]pdf=File.ReadAllBytes(“文件名”);writealBytes(“文件名”,pdf);我将在另一个项目中尝试。谢谢转换为字节时,您对pdf文件使用的是什么类。我使用的是iFormFile您是指FromFile吗?FromFile包装一个字符串,该字符串将损坏二进制pdf。最好使用byte[]pdf=File.ReadAllBytes(“文件名”);writealBytes(“文件名”,pdf);我将在另一个项目中尝试。谢谢