3 votes

Télécharger un fichier PDF vers mysql BLOB en utilisant java.sql.PreparedStatement sans corruption

J'ai essayé de charger un fichier pdf en utilisant java.sql.PreparedStatement a mysql Blob en utilisant le 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 la base de données montre le contenu du blob, mais lorsque j'essaie de récupérer le fichier en utilisant le code ci-dessous, il 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 produit le fichier avec la même taille que l'original, mais le fichier ne s'ouvre pas. Le site pdf le lecteur est lancé mais ne peut pas ouvrir le fichier et donne une erreur 'le fichier a été endommagé ou n'est pas un type de fichier supporté'.

3voto

Sangeet Menon Points 2483

Ahhh...Après un peu de débogage, j'ai trouvé que le code qui télécharge est gênant, et j'ai finalement trouvé la bonne façon de le faire.

Voici ce que j'ai fait... je le poste pour que d'autres personnes ayant le même problème puissent le résoudre

Après avoir converti le java.io.File a java.io.FileInputStream

FileInputStream io = new FileInputStream(inFile);

Définissez le champ BLOB en utilisant psmnt.setBinaryStream()

psmnt.setBinaryStream(3,  (InputStream)io,(int)inFile.length());

0voto

shivam Points 3

Retirer " java.sql.Blob blob = rs.getBlob("DOCUMENT"); "

et ne pas initialiser la longueur, c'est-à-dire qu'au lieu de

int length = (int) blob.length();

écrivez juste

int length;

puis le fichier est téléchargé avec succès profitez-en :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X