【发布时间】:2018-03-26 10:02:05
【问题描述】:
我设法使用此 Java 代码成功上传和下载文件:
上传
ps = conn.prepareStatement("INSERT INTO DOCUMENT_TEMPLATE_FILES (ID, DOCUMENT_TEMPLATE_ID, FILE_NAME, FILE) "
+ " VALUES (?, ?, ?, ?)");
ps.setInt(1, obj.number);
ps.setInt(2, obj.number);
ps.setString(3, file.getSubmittedFileName());
InputStream inputStream = file.getInputStream();
ps.setBinaryStream(4, inputStream, inputStream.available());
ps.executeUpdate();
下载
ps = conn.prepareStatement("SELECT *, OCTET_LENGTH(FILE) AS FILE_LENGTH FROM DOCUMENT_TEMPLATE_FILES WHERE DOCUMENT_TEMPLATE_ID = ?");
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String file_name = rs.getString("FILE_NAME");
.........
byte[] buffer = new byte[4096];
try (InputStream input = rs.getBinaryStream("FILE");
OutputStream output = response.getOutputStream())
{
int numRead = 0;
while ((numRead = input.read(buffer)) != -1)
{
output.write(buffer, 0, numRead);
}
}
但是当我尝试将它用于 2GB 文件时,我得到了内存大小的异常。不幸的是,文件在插入/选择期间存储在 RAM 中。
是否有另一种方法可以在不消耗太多 RAM 内存的情况下解决此问题?
【问题讨论】:
-
file列的数据类型是什么? -
@a_horse_with_no_name 目前是 BYTEA,但如果您推荐,我可以更改它。
-
bytea列的最大长度为 1GB -
@a_horse_with_no_name 好的,您可以推荐哪种列类型来解决上述问题?
标签: java postgresql postgresql-9.4