我接管了一个文件上传功能被破坏的项目。目前,当上传文件时,它会像这样转换为byteArray,然后存储在SQL表中
public static byte[] saveAttachment(String filePath) throws IOException{
InputStream inputStream = new FileInputStream(filePath);
byte[] buffer = new byte[1048576];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while((bytesRead = inputStream.read(buffer)) != -1){
output.write(buffer, 0 , bytesRead);
}
inputStream.close();
return output.toByteArray();
}
我不能说我同意已采取的方法但是我必须努力。我的问题是如何检索要显示的文件?
我读过 https://wiki.apache.org/tapestry/Tapestry5HowToStreamAnExistingBinaryFile
尝试过(没有工作)
@OnEvent(component="viewAttachment")
private Object viewAttachment(){
final File getFile();
final OutputStreamResponse response = new OutputStreamResponse() {
public String getContentType() {
return "image/jpg";
}
public void prepareResponse(Response response) {
response.setHeader ("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
}
@Override
public void writeToStream(OutputStream out) throws IOException {
try {
InputStream in = new FileInputStream(file);
IOUtils.copy(in,out);
in.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
return response;
}
但是我不确定这是正确/最佳的解决方案。
答案 0 :(得分:1)
假设row.getBytes()将图像作为字节数组返回,而row.getName()是图像名称:
GameScene
答案 1 :(得分:0)
最好将文件保存在某个位置并将该位置保存在数据库中。这将有助于拥有数据库的大小。
此外,文件可用且无需繁重的数据库对象即可轻松检索。
或者您可以在数据库中添加BLOB列并将文件存储在数据库中。
将文件转换为文件对象
File image = new File("D:\\a.gif");
FileInputStream fis = new FileInputStream(image);
stmt.setBinaryStream(1, fis, (int) image.length());
使用
添加检索 File image = new File("D:\\java.gif");
FileOutputStream fos = new FileOutputStream(image);
byte[] buffer = new byte[1];
InputStream is = resultSet.getBinaryStream(3);
while (is.read(buffer) > 0) {
fos.write(buffer);
}
fos.close();