【发布时间】:2019-06-01 14:46:36
【问题描述】:
我正在尝试从 SQL Server 库中恢复一些数据文件(主要是 pdf)。
表列属于以下类型:D_BLOB(image) 并包含此类数据:
至于我尝试过的代码和不同的方法,这里将我的不同部分的代码结合起来
byte[] output = qResult.getBytes("DOCUMENT");
Blob blob = qResult.getBlob("DOCUMENT");
String document2 = qResult.getString("DOCUMENT");
InputStream input = qResult.getBinaryStream("DOCUMENT");
FileOutputStream output2 = new FileOutputStream(new File(repertoireDst + "\\" + intitule + "_test2_." + extension));
byte[] buffer = new byte[1024];
while (input.read(buffer) > 0) {
output2.write(buffer);
}
output2.close();
/************************************
* Simple input output Stream
*******************/
InputStream inputStream = blob.getBinaryStream();
OutputStream outputStream = new FileOutputStream(repertoireDst + "\\" + intitule + "_test_." + extension);
int bytesRead = -1;
byte[] buffer2 = new byte[1024];
while ((bytesRead = inputStream.read(buffer2)) != -1) {
outputStream.write(buffer2, 0, bytesRead);
}
inputStream.close();
outputStream.close();
/************************************
* Simple byte writing
*******************/
FileOutputStream fos = null;
fos = new FileOutputStream(new File(repertoireDst + "\\" + intitule + "_V1_EcritureBytesSymple." + extension));
fos.write(output);
fos.flush();
fos.close();
/*************************************************
* Ecriture of bynary stream from blob
***********************************************/
InputStream is = blob.getBinaryStream();
FileOutputStream fos1 = new FileOutputStream(repertoireDst + "\\" + intitule + "_V2_BlobEcritDirectement.txt");
int b = 0;
while ((b = is.read()) != -1) {
fos1.write(b);
}
fos1.flush();
fos1.close();
/**************************************************************************
* Testing for base 64 encoding
************************************************************************/
File fichierDestinationTemp = new File(repertoireDst + "\\" + intitule + "_V3_FichierTxtTemp.txt");
File fichierDestinationTemp2 = new File(repertoireDst + "\\" + intitule + "_V4_FichierEncoderDecoder.txt");
File fichierDestinationTemp3 = new File(repertoireDst + "\\" + intitule + "_V5_FichierEncoder." + extension);
File fichierDestination = new File(repertoireDst + "\" + intitule + "." + extension);
PrintWriter writer = new PrintWriter(fichierDestinationTemp, "Cp1252");
writer.print(document2);
writer.close();
byte[] encodedBytes = Base64.getEncoder().encode(output);
String encodedString = new String(encodedBytes);
FileOutputStream fos2 = new FileOutputStream(fichierDestinationTemp3);
fos2.write(encodedString.getBytes());
fos2.flush();
fos2.close();
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
FileOutputStream fos3 = new FileOutputStream(fichierDestinationTemp2);
fos3.write(decodedBytes);
fos3.flush();
fos3.close();
当然,这会创建我的所有类型的文件,但没有一个 pdf 文件是可读的。我想我错过了什么。 (是的,我知道我正在将某些部分写入 .txt 文件,但这是为了看看我会得到什么,嘿,其中一些甚至在中文中......)
欢迎任何想法,想知道我错过了什么。
【问题讨论】:
-
如果文件之前是 pdf文件,为什么您认为它们可以在记事本中阅读?当然,它看起来像一堆随机字符,因为应用程序不知道如何读取二进制文件。另一方面,你为什么还在使用
image?至少从 SQL Server 2005 开始,它就被弃用了。 -
这些不是 PDF 文件。如果有,您的 blob 内容将以
0x25504446开头。 -
我只是尝试在记事本中打开它们以查看 base64 编码对它们的作用。 (比较字符串)。通常我在浏览器中打开 PDF 文件。另外,我不是创建这个数据库的人,所以我无法真正改变他们不唱形象的事实。还要感谢 Andrey Nilolov,我想那时一定有某种编码/压缩蜜蜂。
标签: java sql-server pdf blob