2013-04-02 18 views
6

Sono nuovo alla tecnologia JAVA, in particolare Servlet. Devo creare un progetto di applicazione Web che abbia un upload e un file di download da/su un server (tomcat). Ho già un servlet di upload, che funziona bene.Servlet per scaricare i file da una cartella specifica?

Ho anche un servlet di download, trovato su Internet. Ma il problema è che questo servlet permette di scaricare solo un file specifico, e il percorso per questo specifico file è dato nel servlet. Devo consentire al client di vedere l'intero contenuto della mia cartella di caricamento e selezionare il file che desidera scaricare da questa cartella.

Il codice del servlet scaricare è questo:

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 



public class DownloadServlet extends javax.servlet.http.HttpServlet implements 
      javax.servlet.Servlet { 
     static final long serialVersionUID = 1L; 
     private static final int BUFSIZE = 4096; 
     private String filePath;` 

public void init() { 
    // the file data.xls is under web application folder 

    filePath = getServletContext().getRealPath("") + File.separator;// + "data.xls"; 
} 

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    File file = new File(filePath); 
    int length = 0; 
    ServletOutputStream outStream = response.getOutputStream(); 
    ServletContext context = getServletConfig().getServletContext(); 
    String mimetype = context.getMimeType(filePath); 

    // sets response content type 
    if (mimetype == null) { 
     mimetype = "application/octet-stream"; 
    } 
    response.setContentType(mimetype); 
    response.setContentLength((int)file.length()); 
    String fileName = (new File(filePath)).getName(); 

    // sets HTTP header 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

    byte[] byteBuffer = new byte[BUFSIZE]; 
    DataInputStream in = new DataInputStream(new FileInputStream(file)); 

    // reads the file's bytes and writes them to the response stream 
    while ((in != null) && ((length = in.read(byteBuffer)) != -1)) 
    { 
     outStream.write(byteBuffer,0,length); 
    } 

    in.close(); 
    outStream.close(); 
} 
} 

La pagina JSP è questo:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Download Servlet Test</title> 
</head> 
<body> 
Click on the link to download: <a href="DownloadServlet">Download Link</a> 
</body> 
</html> 

ho cercato un sacco di servlet, ma tutti loro erano come questo ... loro permesso di scaricare solo un file specifico. Qualcuno può aiutarmi? Grazie mille!

+0

Che cosa hai provato? Hai apportato modifiche al codice che hai scaricato? Che cambiamenti hai fatto? Cosa ha funzionato? Cosa non ha? Hai fatto qualche ricerca oltre a cercare una soluzione completa che puoi scaricare? Copiare e incollare il codice da internet non ti porterà molto lontano, a volte dovrai fare il tuo lavoro. – Adrian

+0

@Adrian Grazie per la risposta. Come ho già detto, il codice precedente funziona correttamente per scaricare solo un file indicato come percorso in Servlet. In questo esempio, nella funzione init(). Ho provato a fornire un percorso come stringa per l'attributo filePath.esempio: filepath = "C: // Apache // Applicazione // dati //", ma ho ricevuto un errore: accesso negato. Ho provato qualcos'altro: per creare un elenco dei contenuti della cartella nel mio JSP con un attributo file e un metodo listFiles, e poi scrivo "
<% = file.getName()%> 'ma funzionava solo in IE con salva bersaglio come. –
AdiCrainic

+0

@ user2236267 prova ad usare un percorso diverso, come * C: \\ external \\ percorso *. Inoltre, assicurati che il tuo utente disponga di autorizzazioni sufficienti per scrivere in quella cartella. Non ho incluso quell'informazione poiché pensavo che tu lo sapessi già. –

risposta

6

Poiché si gestiscono i dati nel metodo doGet, è possibile passare un parametro al servlet in cui viene indicato il nome del file che si desidera scaricare. Per questo, dovresti assumere che il nome del file esista nel tuo percorso di base. Il codice potrebbe andare in questo modo:

HTML

<body> 
    Click on the link to download: 
    <a href="DownloadServlet?fileName=data.xls">Download Link</a> 
</body> 

Java Code Servlet:

protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException { 
    //retrieving the parameter by its name 
    String fileName = request.getParameter("fileName"); //this will return `data.xls` 
    //using the File(parent, child) constructor for File class 
    File file = new File(filePath, fileName); 
    //verify if the file exists 
    if (file.exists()) { 
     //move the code to download your file inside here... 

    } else { 
     //handle a response to do nothing 
    } 
} 

Nota che, poiché il codice utilizza ora File(String parent, String child) costruttore, il vostro filePath non deve contenere il separatore più (questo sarà gestito da Java):

public void init() { 
    // the file data.xls is under web application folder 
    filePath = getServletContext().getRealPath(""); 
} 
+0

** Grazie mille per la risposta ** Ho provato il tuo codice ma non riesco a farlo funzionare. – AdiCrainic

+0

@ user2236267 provalo. Se funziona per le tue esigenze, contrassegnare l'assegno sotto la reputazione per contrassegnare il post come risposta. –

+0

Sono nuovo di stackoverflow.it mi ci vorrà del tempo per lavorare con questo. Ho provato a dare un voto alla tua risposta, ma mi ha detto che ho bisogno di 15 reputazione. Voglio rispondere con il mio nuovo codice, ma dice che il mio commento è troppo grande. – AdiCrainic

1

voi può fare come quella

 public void doGet(HttpServletRequest req, HttpServletResponse res){ 
    res.setContentType("text/html); 
     PrintWriter out=response.getWriter(); 
     String fileName="home.txt"; 
     String filePath="d:\\"; 
    response.setContentType("APPLICATION/OCTET-STREAM"); 
    response.setHeader("Content-Disposition","attachment;fileName=\""+fileName+"\""); 
    int i; 
    FileInputStream file=new FileInputStream(filePath +fileName); 
    while((i=file.read()) !=-1){ 
     out.write(i); 
    } 
    file.close(); 
    out.close(); 
} 
0
// get MIME type of the file 
    String mimeType = context.getMimeType(fullPath); 
    if (mimeType == null) { 
     // set to binary type if MIME mapping not found 
     mimeType = "application/octet-stream"; 
    } 
    System.out.println("MIME type: " + mimeType); 

    // set content attributes for the response 
    response.setContentType(mimeType); 
    response.setContentLength((int) downloadFile.length()); 

Questo modo più dettagliato e la questione come migliorare: https://stackoverflow.com/questions/41914092/how-change-servlet-which-download-single-file-but-can-folderfew-files-in-fold

Problemi correlati