下载/显示存储在SQL表中的文件

时间:2017-03-16 17:20:05

标签: java tapestry

我接管了一个文件上传功能被破坏的项目。目前,当上传文件时,它会像这样转换为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;
}

但是我不确定这是正确/最佳的解决方案。

2 个答案:

答案 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();