2017-03-16 18 views
0

ファイルのアップロード機能が壊れているプロジェクトを引き継ぎました。ファイルがアップロードされたときに、その後、SQLテーブルダウンロード/ 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(); 

} 

に保存されているように、現在それがBYTEARRAYに変換され、私は私が撮影したが、私はそれで働かなければならない、悲しいかなされたアプローチに同意すると言うことはできません。私の質問は、このファイルを表示して表示する方法です。

私はしかし私は、これは適切な/最適解であることを確認していない(動作しませんでした)

@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; 
} 

https://wiki.apache.org/tapestry/Tapestry5HowToStreamAnExistingBinaryFile

を読んで試してみました。

+0

ファイルはバイト配列としてDBに格納されます。なぜクライアントのためだけにファイルに変換するのですか? DBからバイト配列からInputStreamを返すことができます。 – xl0e

+0

@ xl0eはい、バイト配列として格納されます。これらのファイルをユーザーに表示するにはどうすればいいですか?ここでの機能は、任意のファイル形式にできるアップロードされた添付ファイルを表示することです。アップロード部分は問題なく動作します。 –

答えて

0

ファイルを場所に保存し、データベース内の場所を保存することをお勧めします。これは、データベースのサイズを持つのに役立ちます。

また、ファイルがあり、重いデータベースオブジェクトなしで簡単に取得できます。

または、データベースにBLOB列を追加して、ファイルをデータベースに格納することができます。 Fileオブジェクトに

変換ファイル

File image = new File("D:\\a.gif"); 
FileInputStream fis = new FileInputStream(image); 
stmt.setBinaryStream(1, fis, (int) image.length()); 

row.getBytes()は、バイト配列としてあなたのイメージを返し、row.getNameは()イメージ名であると仮定すると

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(); 
+0

少なくとも私の手が縛られている瞬間にこのアプローチを好むでしょう –

+0

私の解決策を変更します –

+0

私はJPA/Eclipselinkを使用しています。同等のものは何でしょうか? –

1

を使用して、それを取得追加:

return new StreamResponse() { 

     @Override 
     public String getContentType() { 
      return "image/jpeg"; 
     } 

     @Override 
     public InputStream getStream() throws IOException { 
      return new ByteArrayInputStream(row.getBytes()); 
     } 

     @Override 
     public void prepareResponse(Response response) { 
      response.setHeader("Content-Disposition", "attachment; filename=\"" + row.getName() + "\""); 
     } 
    }; 
関連する問題