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!
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
@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
@ 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à. –