在一个简单的 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 在 S3 中更新 zip 文件

java 下载异地FTP中的zip文件

Android Java - 如何从 URL 下载 zip 文件?

Java批量文件打包下载

Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载

java 如何将多个文件打包成一个zip后进行下载