1

blobフィールドに保存されているp7mpdfファイルを取得し、特定のURLを指定して直接ダウンロードできるようにする必要があります。

現在、PDFの取得と公開に次のコードを使用していますが、デジタル署名を表示するためのツールで保存されたファイルを開くと、署名が無効であり、PDFが破損しているようです。

public byte[] getPdfOrdini(String xxx, String tipo) throws Exception, SQLException {
    Blob pdf;
    byte[] pdfData = null;
    Connection conn = new test().getConnectionOrdini();
    PreparedStatement pstmt = null;

    // Query
    if(tipo.equalsIgnoreCase("pnf"))
        pstmt = conn.prepareStatement("Select ... From .. Where ..");
    if(tipo.equalsIgnoreCase("pf"))
        pstmt = conn.prepareStatement("Select ... From .. Where .. = ?");
    pstmt.setString(1, xxx);
    ResultSet rset = pstmt.executeQuery();

    if(tipo.equalsIgnoreCase("pnf")){

        while (rset.next()) {
            pdf = rset.getBlob(1);
            pdfData = pdf.getBytes(1, (int) pdf.length());
        }

        //System.out.println("dimensione blob --> " + pdfData.length);
    }else{
        while (rset.next()) {
            pdf = rset.getBlob(1);
            pdfData = pdf.getBytes(1, (int) pdf.length());
        }
    }
    rset.close();
    pstmt.close();

    return pdfData;
}

ダウンロード用のPDFを公開するためのこのコード:

<jsp:useBean id="PDF" class="pdf.test" scope="session" />
<%
Connection conn = null;

if ( request.getParameter("protocollo") != null )
{

String protocollo = request.getParameter("xxx") ;
String tipo = request.getParameter("type");   

try
{  
   String downloadFileName = "O" + xxx + ".pdf.p7m";
   conn = new pdf.test().getConnection();
   conn.setAutoCommit (false);  

   // get the image from the database
   byte[] pdfData = PDF.getPdfOrdini(xxx, tipo);   
   // display the image

   File pdf = new File(downloadFileName);
   FileOutputStream fos = new FileOutputStream(pdf);
   fos.write(pdfData);
   fos.flush();
   fos.close();

   response.setContentType( "application/x-download" );
   response.setHeader( "Content-Disposition", "attachment; filename=" + downloadFileName );
   conn.close();
}
catch (IllegalStateException il){
}
catch (Exception e)
{
  e.printStackTrace();
  throw e;
}
finally
{

}  
}
%>

どんな助けでも大歓迎です。

4

1 に答える 1

0

読み取り用の 2 つの while ブロックは同じですが、とにかく動作するはずです。
あなたはこれを試すことができます.DB2で私のために常に働いていました:

byte[] pdfData = null;
ResultSet rset = pstmt.executeQuery();
if (rset.next())
{
  pdfData = rset.getBytes(1);
}
conn.close();
return pdfData;

追加:
次のことは、JSP でブラウザにデータを書き込んでいないことです。
このようなもの:

byte[] pdfData = PDF.getPdfOrdini(xxx, tipo);
char[] data = new char[pdfData.length];
for (int i = 0; i < pdfData.length; i++) {
    data[i] = (char) pdfData[i];
    }
response.setContentType( "application/x-download" );
response.setHeader( "Content-Disposition", "attachment; filename=" + downloadFileName );
response.setHeader("Content-length", Integer.toString(data.length));
out.write( data, 0, data.length);
out.flush();
于 2012-12-03T10:14:47.217 に答える