[我是C#
和EF
的新手,如果我对某些术语有误,我深表歉意,因为我正在修复写有Web APIs
的开发人员的代码,但该代码不可用。
总而言之,我们有一个JAVA
前端,该前端上传PDF
文件并将它们作为SQL Server
存储在我们的varbinary(max)
数据库中。当JAVA
Web应用程序下载PDF
时,它将调用数据库函数,该函数将varbinary
数据返回到byte[]
变量中,然后JAVA
Web App能够对其进行文件流传输并另存为PDF
]没问题。
[文件数据的数据库值,以及返回varbinary(max)
列的函数返回的值,以及在byte[]
中使用的JAVA
中存储的内容,然后将其转换为字符串,都一样,看起来像:
"0x255044462D312E360D25E2E3CFD30D0A34372030206F626A0D3C3C2F414442455F46696C6C5369676E496E666F3C3C2F56657273696F6E203130302F666F726D4..."
据我所知,这是varbinary
数据的格式。
在使用Web API
的EF
中,相同的功能在EF
模型中建模,并显示为Complex Type
,并且Filedata
列的类型为Binary
,根据MS docs
]这是正确的:
在C#模型中,Filedata
定义为:
public byte[] FileData { get; set; }
有一个Controller
,它从函数中返回数据,如下所示:
[HttpGet]
public IHttpActionResult FileAttachment_Get(string FileAttachmentID)
{
using (TSTDBContext dbContext = new TSTDBContext())
{
Guid FileAttachmentGUID = new Guid(FileAttachmentID);
var entity = dbContext.FileAttachment_Get(FileAttachmentGUID).SingleOrDefault();
if (entity != null)
{
/*var str = System.Text.Encoding.Default.GetString(entity.FileData);*/
return Ok(new { results = entity });
}
else
{
return NotFound();
}
}
}
实体变量包含Filedata
值,然后我们可以在Web API中返回该值,供移动应用使用以显示PDFs
。返回的值与数据库中的值不同,如下所示:
"JVBERi0xLjYNJeLjz9MNCjQ3IDAgb2JqDTw8L0FEQkVfRmlsbFNpZ25JbmZvPDwvVmVyc2lvbiAxMDAvZm9ybUlEKDY0OTFiNDYzLTA2MGEtNGU1Yy05NmYyLTljMThkMTZlNDlhZik+Pi9NZXRhZGF0YSA1NSAwIFIvT0NQcm9wZXJ0aWVzPDwvRDw8L09OWzU2IDAgUl0vT3JkZXJbXS9SQkdyb3Vwc1tdPj4vT0NHc1s1NiAwI..."
[当我们将其用于PDF
文件时,PDF
文件已损坏。该函数还返回了其他数据,并且该数据是正确的,但是没有一个数据为varbinary
类型。 varbinary
数据是我们遇到的唯一字段,并且返回的字段与数据库中存储的字段不同。
上面注释的代码将其转换为字符串,还会显示不同的数据。
我的问题是,为什么EF
将不同的数据返回到varbinary(max) column
的数据库中?
我希望我已经解释清楚了,但是如果您需要更多详细信息,请告诉我。
谢谢。
MVC Controller响应可能是base64编码的,因此在创建PDF之前,您需要在客户端中使用base64解码。