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

PiccolaAnimaBlu

Nuovo Utente
11 Giu 2010
10
0
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....
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
Ciao, dovresti creare una Servlet che definisce HttpResponse giusti per il download. Potresti postare il codice della parte dove dovrebbe venire il download?
 

PiccolaAnimaBlu

Nuovo Utente
11 Giu 2010
10
0
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
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
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
 

lespaul

Utente Attivo
30 Lug 2009
91
6
0
www.simplesoft.it
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
 

PiccolaAnimaBlu

Nuovo Utente
11 Giu 2010
10
0
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?