在一个简单的java程序中下载zip文件中的blob数据

在一个简单的java程序中下载zip文件中的blob数据,java,download,zipfile,Java,Download,Zipfile,我无法使用下面的代码下载文件,因为我有多种类型的扩展名要下载,我想压缩所有文件并下载。如果我运行下面的代码,它会说文件已损坏。有人能帮忙吗 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.

我无法使用下面的代码下载文件,因为我有多种类型的扩展名要下载,我想压缩所有文件并下载。如果我运行下面的代码,它会说文件已损坏。有人能帮忙吗

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();
        }
    }
}

这不需要前端。使用以下代码解决问题

公共类BlobDataExtract{ 静态ZipOutputStream zos=null; 静态字符串url=“jdbc:oracle:thin:@hostname:1521:SID”


}

我还不明白。现在,在循环的每个I创建中,您都创建了一个文件
C:/abc.vsd
,它替换了任何现有的文件,我认为它应该是一个visio文件,并且已损坏。但是你希望每次迭代都有一个文件,并最终将它们放在一个zip中?是的,我有不同类型的文件。不仅仅是visio,比如.txt、.xlsx、.vsd。我想所有的文件被添加到一个zip文件和下载。可能吗?应该是,你能从
表的某个字段中确定文件类型吗?你知道吗,blob中存储的二进制文件还没有损坏?有什么东西可以在本地作为新文件下载而不是写入文件吗?即使在创建了一个没有数据的新文件后,它也会说文件在写入数据后被破坏了
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();
    }

}