下载存储的PDF损坏

时间:2019-01-20 14:21:12

标签: c# asp.net-core

我正在使用MVC在.Net Core中的Web中工作。我想从SQL Server的数据库中下载PDF。我将PDF保存在 varbinary 中的数据库中,在控制器中,我将PDF保存在byte[]中。

但是,当我从网上下载PDF时,我想查看PDF。说PDF已损坏。

这是在控制器中下载PDF的方法:

[HttpGet]
public FileContentResult DownloadFile(string DNI)
{
    Byte[] file1 = _manager.SetFile1(DNI);

    Response.Headers.Add("content-disposition", "attachment; filename=dddddd.pdf");
    return new FileContentResult(file1,"application/pdf");
}

这是当我将PDF插入控制器时以及使用 varbinary 类型保存在SQL Server中之后的代码:

var reader2 = new StreamReader(certificateCompany.OpenReadStream());

string contentAsString2 = reader2.ReadToEnd();

byte[] contentAsByteArray2 = GetBytes(contentAsString2);

certificateCompany是IFormFile类型。他来自这里:

<input type="file" name="attachedWorking1" id="attachedWorking1" accept=".pdf" multiple />

之后,在我的控制器中:

        [HttpPost]
        public async Task<IActionResult> FormCause(IFormFile attachedWorking1)
       {
        var certificateCompany = attachedWorking1;

        var reader1 = new StreamReader(certificateCompany.OpenReadStream());

        string contentAsString1 = reader1.ReadToEnd();

        byte[] contentAsByteArray1 = GetBytes(contentAsString1);

        petition.file1 = contentAsByteArray1;

        _manager.InsertPetition(petition);

            return View("Close");
    }

1 个答案:

答案 0 :(得分:4)

这是XY problem,因为将PDF保存到数据库的代码不正确。

您要保存的字符串不是PDF。

在这种情况下,请勿使用流阅读器。它用于文本。

代替Read,直接调用certificateCompany.OpenReadStream()时返回的流中的字节。

[HttpPost]
public async Task<IActionResult> FormCause(IFormFile attachment) {
    var certificateCompany = attachment;

    var stream = certificateCompany.OpenReadStream();

    var length =  (int)stream.Length;

    byte[] data = new byte[length];

    await stream.ReadAsync(buffer: data, offset: 0, count: length);

    //...

    petition.file1 = data;

    _manager.InsertPetition(petition);

    return View("Close");
}