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.
Vous devez vous connecter pour publier un commentaire.
Ahhh...Après un peu de débogage, j'ai trouvé le code de téléchargement est gênante, et a finalement obtenu le droit de le faire.
Voici ce que j'ai fait...je poste pour que d'autres avec le même problème peut résoudre
Après la Conversion de la
java.io.File
àjava.io.FileInputStream
Définir le champ BLOB à l'aide de
psmnt.setBinaryStream()
supprimer "
java.sql.Blob blob = rs.getBlob("DOCUMENT");
"et ne pas initialiser la longueur que je.e au lieu de
il suffit d'écrire
puis il télécharge un fichier avec succès .. enjoy 🙂