Upload d'un fichier

Résolu/Fermé
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015
- Modifié par KX le 1/05/2015 à 20:51
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015
- 1 mai 2015 à 22:53
bonjour,
j'ai fait un programme qui permet de télécharger un fichier a partir de la base de donnée ;mais quand je clique sur le bouton télécharger j'ai cette exception:
tton telecharger

voici le code

 
package Servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet("/downloadFileServlet")
public class DownloadServlet extends HttpServlet {
 
    // size of byte buffer to send file
    private static final int BUFFER_SIZE = 4096;   
     
    // database connection settings
    private String dbURL = "jdbc:mysql://localhost:3306/bdd";
    private String dbUser = "root";
    private String dbPass = "";
     
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // get upload id from URL's parameters
        int uploadId = Integer.parseInt(request.getParameter("idTemp"));
         
        Connection conn = null; // connection to the database
         
        try {
            // connects to the database
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            conn = DriverManager.getConnection(dbURL, dbUser, dbPass);
 
            // queries the database
            String sql = "SELECT * FROM cours WHERE idTemp = ?";
            PreparedStatement statement = conn.prepareStatement(sql);
            statement.setInt(1, uploadId);
 
            ResultSet result = statement.executeQuery();
            if (result.next()) {
                // gets file name and file blob data
                String fileName = result.getString("title");
                Blob blob = result.getBlob("file");
                InputStream inputStream = blob.getBinaryStream();
                int fileLength = inputStream.available();
                 
                System.out.println("fileLength = " + fileLength);
 
                ServletContext context = getServletContext();
 
                // sets MIME type for the file download
                String mimeType = context.getMimeType(fileName);
                if (mimeType == null) {        
                    mimeType = "application/octet-stream";
                }              
                 
                // set content properties and header attributes for the response
                response.setContentType(mimeType);
                response.setContentLength(fileLength);
                String headerKey = "Content-Disposition";
                String headerValue = String.format("attachment; filename=\"%s\"", fileName);
                response.setHeader(headerKey, headerValue);
 
                // writes the file to the client
                OutputStream outStream = response.getOutputStream();
                 
                byte[] buffer = new byte[BUFFER_SIZE];
                int bytesRead = -1;
                 
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, bytesRead);
                }
                 
                inputStream.close();
                outStream.close();             
            } else {
                // no file found
                response.getWriter().print("File not found for the id: " + uploadId);  
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            response.getWriter().print("SQL Error: " + ex.getMessage());
        } catch (IOException ex) {
            ex.printStackTrace();
            response.getWriter().print("IO Error: " + ex.getMessage());
        } finally {
            if (conn != null) {
                // closes the database connection
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }          
        }
    }
}


et aussi la page jsp:


<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>telechargement du cours</title>
    </head>
    <body>
        
        
        
        <br><br>
        <table border="1" width="254" cellpadding="5"/>
        <thead><th colspan="3"> Download      </th> 
</thead>
<tbody>
    <tr>
        <td>
<center><b>id</b></center><td>
<center><b>title</b></center></td>
<td><center><b>file</b></center>
        </td>
        
        
        
    </tr>
    
    <% 
         Class.forName("com.mysql.jdbc.Driver");
         
            Connection cn=DriverManager.getConnection("jdbc:mysql://localhost:3306/bdd","root","");
            
            String sql2="SELECT * FROM cours";
            Statement st=cn.createStatement();
            ResultSet rs= st.executeQuery(sql2);
            
            
            if(!rs.isBeforeFirst())
                
                
                
            {
                
            
            %>
            <tr>
                
                <td colspan="3"><center><% out.print("no file");%></center></td>
        </tr>
        <%
           }
           while(rs.next())   
{
    %>
    <tr>
        
        <td><center><% out.print(rs.getString("idTemp"));%>
           <td><center><% out.print(rs.getString("title"));%>  
               <form action="Download" method="GET">
                              
                                  
             
             
             <td> <input type="submit" value="Telecharger"</td>
          </form
               
        
        
    </tr> 
    <%}
           %>
                
                
                
             
    
</tbody>
</table>
           <% rs.close();
           st.close();
         cn.close();
         %>
    </body>
</html>




pouvez vous m'aidez svp.merci

3 réponses

KX
Messages postés
16585
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 août 2022
2 972
1 mai 2015 à 12:17
Bonjour,

Tu pourrais chercher un petit peu avant de poser ta question sur le forum.

Le message d'erreur dit :

NumberFormatException: null
    java.lang.Integer.parseInt
    Servlet.DownloadServlet.doGet(DownloadServlet.java:40) 

Ce qui signifie dans ton doGet, ligne 40, de DownloadServlet, c'est à dire sur ce code :
Integer.parseInt(request.getParameter("idTemp"));
tu as dans la méthode parseInt, un paramètre qui est null, qui ne peut pas être converti en nombre.

C'est finalement le même problème que dans tes autres questions, tu dois vérifier que les paramètres de la requête existent avant de commencer le traitement.

String idTemp=request.getParameter("idTemp");
if (idTemp==null) {
    // j'envoie un message d'erreur, il manque une donnée
    return; // je ne fais pas la suite, ça ne sert à rien
}
1
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 12:39
Bonjour,
j'ai fait ce que vous m'avez donner il m'a retourner une page blanche.
0
KX
Messages postés
16585
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 août 2022
2 972 > natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 12:46
Tout dépend ce que tu fais au moment où je dis "j'envoie un message d'erreur".
Si tu ne fais rien effectivement ce sera une page blanche, si tu fais un
response.getWriter().print("idTemp is missing");
pour écrire un message d'erreur, c'est ce message qui apparaîtra.

Tu peux également faire (ce qu'un site normal fait en général) c'est à dire renvoyer vers une page d'erreur (avec un code 400 dans ton cas).
0
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 12:47
comment le resoudre svp.merci
0
KX
Messages postés
16585
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 août 2022
2 972 > natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 12:53
1) Tu gères le cas d'erreur comme je te l'ai montré
2) Tu passes à la requête le paramètre manquant pour qu'il soit pris en compte.

http://monsite/mapage?idTemp=42
0
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 12:57
la meme chose
0
Whismeril
Messages postés
17686
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 août 2022
849
1 mai 2015 à 19:34
Bonsoir, j'ai corrigé la coloration syntaxique, voir ici
0
natasha82
Messages postés
55
Date d'inscription
vendredi 20 mars 2015
Statut
Membre
Dernière intervention
9 juin 2015

1 mai 2015 à 22:53
j'ai réglé le problem: on rajoutant ça au formulaire


<input type="hidden" name="title" value="<%=rs.getString("idTemp") %>"/>

0