在一个简单的 java 程序中下载 zip 文件中的 blob 数据
Posted
技术标签:
【中文标题】在一个简单的 java 程序中下载 zip 文件中的 blob 数据【英文标题】:Download blob data in a zip file in a simple java program 【发布时间】:2019-10-30 19:02:53 【问题描述】:我无法使用以下代码下载文件,因为我有多种类型的扩展要下载,我想压缩所有文件并下载。如果我运行下面的代码,它会说文件已损坏。有人请帮忙吗?
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcReadFile
private static final int BUFFER_SIZE = 4096;
public static void main(String[] args)
String url = "jdbc:oracle:thin:@xxx:xxxx:xxx";
String user = "xxx";
String password = "xxx";
String filePath = "C:/abc.vsd";
try
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "SELECT DOC_BO FROM table fetch first 10 rows only";
PreparedStatement statement = conn.prepareStatement(sql);
ResultSet result = statement.executeQuery();
if (result.next())
Blob blob = result.getBlob("DOC_BO");
InputStream inputStream = blob.getBinaryStream();
OutputStream outputStream = new FileOutputStream(filePath);
int bytesRead = -1;
byte[] buffer = new byte[BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, bytesRead);
inputStream.close();
outputStream.close();
System.out.println("File saved");
conn.close();
catch (SQLException ex)
ex.printStackTrace();
catch (IOException ex)
ex.printStackTrace();
【问题讨论】:
我还不明白。现在,在循环的每次迭代中,您正在创建一个文件C:/abc.vsd
,它替换任何现有的文件,我认为应该是一个 visio 文件,并且已损坏。但是您希望每次迭代一个文件并最终将它们全部放在一个 zip 中?
是的,我有不同类型的文件。不仅是 visio,像 .txt、.xlsx、.vsd。我希望将所有文件添加到 zip 文件并下载。有没有可能
应该是,你能从table
的某个字段判断文件类型吗?你知道吗,存储在 blob 中的二进制文件还没有损坏?
有什么东西可以在本地下载为新文件而不是写入文件吗?
即使在创建一个没有数据的新文件后,它也会说文件在写入数据后损坏
【参考方案1】:
这不需要前端。使用以下代码解决了问题。
公共类 BlobDataExtract 静态 ZipOutputStream zos = null; 静态字符串 url = "jdbc:oracle:thin:@hostname:1521:SID";
public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url, "user", "password");
String sql = "select Blob_Data,ORIG_NM from table";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
byte[] docBlob = null;
String filename = null;
FileOutputStream fos = new FileOutputStream("C:/Users/test.zip");
zos = new ZipOutputStream(fos);
while (rs.next())
docBlob = rs.getBytes("Blob_Data");
filename = rs.getString("ORIG_NM");
try
zos.putNextEntry(new ZipEntry(filename));
zos.write(docBlob, 0, docBlob.length);
catch (FileNotFoundException ex)
System.err.println("A file does not exist: " + ex);
catch (IOException ex)
System.err.println("I/O error: " + ex);
zos.closeEntry();
【讨论】:
以上是关于在一个简单的 java 程序中下载 zip 文件中的 blob 数据的主要内容,如果未能解决你的问题,请参考以下文章
Android Java - 如何从 URL 下载 zip 文件?