我正在使用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");
}
答案 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");
}