【发布时间】: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 中的二进制文件还没有损坏? -
有什么东西可以在本地下载为新文件而不是写入文件吗?
-
即使在创建一个没有数据的新文件后,它也会说文件在写入数据后损坏