问题描述
@H_502_0@一些 PDF 文件使用带有 OLE 容器格式的 Oracle Forms 上传到 Oracle 数据库。这些文件保存在 BLOB 字段中,并使用 C# API 函数检索,该函数将 BLOB 转换为 base64 字符串并将其作为输出返回。因此,当我们尝试使用在线转换器将 base64 字符串转换为 PDF 文件时,会引发以下错误:
'文件的 MIME 被检测为“application/octet-stream”,但解码器将其显示为 application/pdf' 无法生成文件。
@H_502_0@在排查问题时,我们尝试将物理PDF文件转换为BLOB并将其保存在数据库字段中:生成的base64字符串可以成功转换并且可以生成PDF,但是Oracle Forms无法显示
@H_502_0@有什么建议可以解决这个问题吗?喜欢:
- 我们是否必须改变从数据库或 API 检索 BLOB 的方式?喜欢只提取 PDF Blob 数据而不提取 OLE 容器?
- 我们是否必须将 Oracle 端或 API 端的 MIME 类型强制设置为 application/pdf ?
- 是否可以在 Oracle Forms 上显示从物理转换为 blob 的文件?
public static byte[] StripOleHeader(byte[] fileData)
{
const string START_BLOCK = "%PDF-";
int startPos = -1;
Encoding u8 = Encoding.UTF7;
string strEncoding = u8.GetString(fileData);
if (strEncoding.IndexOf(START_BLOCK) != -1)
{
startPos = strEncoding.IndexOf(START_BLOCK);
}
byte[] retByte;
if (startPos == -1)
{
retByte = new byte[0];
}
else {
retByte = new byte[fileData.LongLength - startPos];
Array.copy(fileData,startPos,retByte,fileData.LongLength - startPos);
}
return retByte;
}
@H_502_0@从 Oracle 过程读取 Oracle BLOB 时的 API 方法:
Byte[] byteArr = new Byte[blobPDF.Length];
blobPDF.Read(byteArr,System.Convert.ToInt32(blobPDF.Length));
var stripedArray = StripOleHeader(byteArr);
if (stripedArray.Length > 0)
{
createPDFfile(byteArr);
objPdf = Convert.ToBase64String(stripedArray);
}
else
{
objPdf = "";
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)