Télécharger le fichier PDF à mysql BLOB à l'aide de java.sql.PreparedStatement sans corruption

J'ai essayé de uplad un fichier pdf à l'aide de java.sql.PreparedStatement à mysql champ Blob à l'aide du code suivant.

        File inFile = new File("Path+BLOCK.pdf");
        byte[] b = new byte[(int)inFile.length()];

        PreparedStatement psmnt = (PreparedStatement) 
        con.prepareStatement("INSERT  INTO 
                        2012DOC (SRNO,DOCUMENT) 
                       VALUES  (?,?)"
                      );   //con is java.sql.Connection object
        psmnt.setString(1, "1200021");
        psmnt.setBytes(2, b);
        psmnt.executeUpdate();

Ce code s'exécute sans erreur et de la base de données blob contenu, mais lorsque j'essaie de récupérer le fichier à l'aide du code ci-dessous donne un fichier corrompu qui ne s'ouvre pas.

ResultSet rs=con.Execute("SELECT DOCUMENT FROM 2012DOC");
rs.next();
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=kjsahkjd.pdf");
java.sql.Blob blob = rs.getBlob("DOCUMENT");
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream in = blob.getBinaryStream();
int length = (int) blob.length();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
while ((length = in.read(buffer)) != -1) {
servletOutputStream.write(buffer, 0, length);
}
in.close();
servletOutputStream.flush();
servletOutputStream.close();

Il génère le fichier avec la même taille que l'original,mais le fichier ne s'ouvre pas.
Le pdf lecteur est tiré, mais impossible d'ouvrir le fichier et donne une erreur " le fichier a été endommagé ou non pris en charge type de fichier

  • J'ai aussi eu ce genre de problèmes. Pouvez-vous préciser de ne pas ouvrir? Le lecteur de PDF est tiré, mais il ne peut pas afficher le fichier? Ou le navigateur ne prend pas fin le télécharger?
  • Le lecteur de pdf est tiré, mais il ne peut pas ouvrir le fichier. Le lecteur donne une erreur " le fichier a été endommagé ou non pris en charge type de fichier
  • Sans reproductible cas de test, nous pouvons seulement essayer de deviner de découper le problème en sous-problèmes. Je pense que votre première tentative convient de comparer le fichier d'origine et le contenu de base de données, pour voir si elles sont vraiment binaire égale. Le pilote est l'officiel de MySQL Connector/J, n'est-ce pas?
  • Aussi, au lieu de lire le contenu du fichier en mémoire, vous feriez mieux d'utiliser PreparedStatement.setBlob(int, InputStream). Selon les docs, setBytes utilise (LONG)VARBINARY
  • J'ai trouvé un moyen pour que, à l'aide de setBinaryStream... Posté la réponse pour les autres de la référence.