[JSP] Download di file di (quasi) ogni tipo!

Discussione in 'Java' iniziata da PiccolaAnimaBlu, 25 Giugno 2010.

  1. PiccolaAnimaBlu

    PiccolaAnimaBlu Nuovo Utente

    Registrato:
    11 Giugno 2010
    Messaggi:
    10
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    Buon pomeriggio!
    Esistono degli script per permettere il download di un file immagine o di un pdf da un sito web?
    voglio che cliccando sul link si avvii il download e non l'apertura del file...
    consigli?
    ho visto che esiste una script in php, ma a me serve in jsp....
     
  2. lespaul

    lespaul Utente Attivo

    Registrato:
    30 Luglio 2009
    Messaggi:
    91
    Mi Piace Ricevuti:
    6
    Punteggio:
    0
    Home Page:
    Ciao, dovresti creare una Servlet che definisce HttpResponse giusti per il download. Potresti postare il codice della parte dove dovrebbe venire il download?
     
  3. PiccolaAnimaBlu

    PiccolaAnimaBlu Nuovo Utente

    Registrato:
    11 Giugno 2010
    Messaggi:
    10
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    Codice:
    <%@page contentType="text/html" pageEncoding="UTF-8" import="tredtube.*, java.util.* "%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
    <jsp:useBean id="utente" class="tredtube.LoginUtente" scope="session"/>
    <jsp:useBean id="DBacademicproject" class="tredtube.DatabaseAcademicProject" scope="application"/>
    
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Book of academic project</title>
            <link rel="stylesheet" type="text/css" href="css/stile.css"/>
            <script type="text/javascript" src="js/jquery-1.3.2.js"></script>
            <script type="text/javascript" src="js/myfunc.js"></script>
        </head>
        <body>
            <!-- per vedere tutti i progetti accademici simile a book o researcher-->
            <!-- qui mettiamo il div con l'intestazione -->
            <div class="intestazione">
                <jsp:include page="viewIntestazione.jsp"/>
            </div>
    
            <!-- qui mettiamo i diversi div per la barra di navigazione-->
    
                <div class="navigationbar">
                <jsp:include page="viewNavigationBar.jsp"/>
                </div>
                <div class="login">
                <jsp:include page="viewLogin.jsp"/>
                </div>
    
                <div class="titolocentrato">
                    Book of academic project
                </div>
                <div class="centrato">
                    <%//prendo gli academic project da database
                  ArrayList<AcademicProject> academicproject = DBacademicproject.getAcademicProject();
                  if(academicproject.size()>0){
    
                      //prendo il numero della pagina che sto visualizzando
                      String pageN= request.getParameter("pageNum");
                      int pageNum = 1;
                      if(pageN==null || pageN.length()==0){
                      pageNum = 1;
                      }
                      else{
                        pageNum= Integer.parseInt(pageN);
                      }
    
                      //variabile di inzio e fine del for
                      int inizio=0;
                      int fine=10;
                      if(fine>academicproject.size()){
                        fine =academicproject.size();
                      }
                      if(pageNum==1){
                      inizio=0;
                      }
                      else{
                      inizio=(pageNum-1)*10;
                      fine= pageNum*10;
                      //se la fine supera la size, allora size è la fine
                      if(fine>academicproject.size()){
                        fine = academicproject.size();
                      }
                      }
    
    
                %>
                <table border="0" cellspacing="15" width="100%">
                       <thead>
                            <tr>
                                <th width="20%">Username</th>
                                <th width="20%">Title</th>
                                <th width="20%">Description</th>
                                <th width="20%"> Reference </th>
                                <th width="20%"> Link </th>
                            </tr>
                        </thead>
                        <tbody>
                            <%
                                for(int i=inizio; i<fine; i++){
                                String background = "";
                                if(i%2==0){
                                 //è pari
                                background="#8F8F8F";
                                 }
                            %>
                            <tr bgcolor="<%=background%>">
                                   <td width="20%" align="center"><a href="viewProfiloUtente.jsp?username=<%=academicproject.get(i).getUsername() %>"><%=academicproject.get(i).getUsername() %></a></td>
                                    <td width="20%" align="center"><%=academicproject.get(i).getTitolo()%></td>
                                    <td width="20%" align="center"><%=academicproject.get(i).getDescrizione() %></td>
                                    [B]<td width="20%" align="center"><a href="<%=academicproject.get(i).getRiferimento()%>" target="_blank">Download</a></td>[/B]
                                    <td width="20%" align="center"><a href="<%=academicproject.get(i).getLink()%>"><%=academicproject.get(i).getLink()%></a></td>
                                </tr>
    
                                <%}%>
                        </tbody>
    
                    </table>
    
                        <!-- controls pagina -->
    
                                <div align="center" id="controls" >
                                    <div class="prev"><a href="viewBookOfAcademic.jsp?pageNum=<%
                                                                if(pageNum>1){
                                                                out.print(pageNum-1);
                                                                }
                                                                %>">PREV</a></div>
    
                                                                <div>  <%
                                int numeroPagine = (int)(academicproject.size()/10)+1;
                                String style="";
                                if(numeroPagine>1){
                                for(int i = 0; i<numeroPagine; i++){
    
                                if((i+1)==pageNum){
                                style="font-weight:bold; font-size:24px;";
                                }
                                else{
                                style="";
                                }
                                %>
                                <a href="viewBookOfAcademic.jsp?pageNum=<%=i+1%>"><span style="<%=style%>"><%=(i+1)%></span></a>
                                <%
                                }
                                }
    
                            %></div>
    
                            <div class="next"> <a href="viewBookOfAcademic.jsp?pageNum=<%
                                                                if(pageNum<numeroPagine){
                                                                out.print(pageNum+1);
                                                                }
                                                                else{
                                                                out.print(pageNum);
                                                                }
                                                                %>">NEXT</a></div>
                        </div>
                <!-- fine controls pagina -->
                        <p>Signal your academic project <a href="viewAcademicProject.jsp?stato=academic project">here</a></p>
                    <%}
                        else{out.print("We don't have any academic project!");}
                    %>
    
                </div>
                     <!--qui c'è il footer -->
                <div class="footer">
                 <jsp:include page="viewFooter.jsp"/>
                 </div>
        </body>
    </html>
    
    la parte in grasetto è il download. prendo dal database il percorso del file, senza aggiungere altri tag specifici
     
  4. lespaul

    lespaul Utente Attivo

    Registrato:
    30 Luglio 2009
    Messaggi:
    91
    Mi Piace Ricevuti:
    6
    Punteggio:
    0
    Home Page:
    Duqnue, dovresti gestire tutto da Servlet. Ti spiego, ti crei una Servlet magari la chiami ServletDownload dove per qualsiasi download gli accodi il path del file che deve scaricare.
    Qui ti posto una servlet per un file .zip, per un'altro tipo di file basta modificare gli header,
    comuqnue il meccanismo principale è questo. Il codice della Servlet:
    Codice:
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            String path = request.getAttribute("file").toString();
            //Apro il file
            FileInputStream inStream = new FileInputStream(path);
            
            //Setto gli header della risposta per il download ZIP (in questo caso)
            response.setContentType("application/zip");
            response.setContentLength(inStream.available());
            response.addHeader("Content-Disposition", "attachment; filename="+path);
            response.addHeader("Content-Transfer-Encoding", "binary");
            response.addHeader("Content-Description", "File Transfer");
    
    
            //Leggo il file
            byte [] data = new byte[inStream.available()];
            inStream.read(data);
    
            //Apro lo stream per avviare il download
            ServletOutputStream out = response.getOutputStream();
            out.write(data);//Invio il file
            out.flush();
            out.close();
        } 
    
    Ora quando dovrai scrivere il link del download basta fare cosi:
    Codice:
    <a href="http://www.mioserver.it/ServletDownload?file=miofile.zip">Scarica file</a>
    
    Il codice non l'ho purtroppo testato, potrebbe esserci qulache errore, facci sapere

    Ciao
     
  5. alessandro1997

    alessandro1997 Utente Attivo

    Registrato:
    6 Ottobre 2009
    Messaggi:
    5.303
    Mi Piace Ricevuti:
    1
    Punteggio:
    0
    Occupazione:
    Studente
    Località:
    Roma
    Home Page:
    Comunque io aggiungerei qualche controllo sul percorso, onde evitare che l'applicazione venga usata da malintenzionati per scaricare informazioni sensibili...
     
  6. lespaul

    lespaul Utente Attivo

    Registrato:
    30 Luglio 2009
    Messaggi:
    91
    Mi Piace Ricevuti:
    6
    Punteggio:
    0
    Home Page:
    Ciao Alessandro, grazie, si certo sicuramente, la Servlet l'ho fatta al volo giusto per far capire un modo per procedere. Se lasciata in questo modo se ne potrebbero combinare di tutti i colori :).
    Si potrebbe fare un query in un database che contiene i possibili file che si possono scaricare, altrimenti un bel 403 Forbidden.
    Meno male che qualcuno ci richiama alla 'sicurezza' altrimenti poveri noi :crying:

    Grazie

    Ciao
     
  7. PiccolaAnimaBlu

    PiccolaAnimaBlu Nuovo Utente

    Registrato:
    11 Giugno 2010
    Messaggi:
    10
    Mi Piace Ricevuti:
    0
    Punteggio:
    0
    Grazie mille per le risposte....
    ma ho ancora due domandine:
    1) come faccio nella servlet a distinguere i diversi tipi di file (pdf, jpg, ecc) e cambiare gli header?
    2) alessandro, mi puoi dire un esempio di controllo sul percorso?
     
Sto caricando...

Condividi questa Pagina