Visualizzazione dei risultati da 1 a 5 su 5

Discussione: download file Java

  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    2

    download file Java

    Premetto che sono partiolarment edi giuno di Java, devo però riuscire a fare il download di un file posizionato nella cartella WEB-INF del TOMCAT utilizzando una servlet.
    Su internet ho trovato la seguente routine, compilandola ottengo degli errori relativi al getlogger. Cosa devo inserire al posto di "info.synaptica.ifaber.servlet.OpenMyFile"
    il valore fname indica la cartella dove è salvato il file? In che modo la devo inserire?

    Grazie



    /**
    * Servlet implementation class OpenFile
    */
    public class OpenMyFile extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
    public final static Logger logger = Logger.getLogger("info.synaptica.ifaber.servlet.Op enMyFile");

    public OpenMyFile() {
    super();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    try
    {
    String requestedFile = request.getParameter("fname");
    if (requestedFile == null)
    throw new Exception("Specificare nome file");

    String sid = request.getSession().getId();
    if (sid.equals(request.getParameter("sid")) == false) {
    throw new Exception("Non autorizzato all’utilizzo della servlet");
    }



    File file = new File(URLDecoder.decode(requestedFile, "UTF-8"));
    logger.info("File richiesto: " + URLDecoder.decode(requestedFile, "UTF-8"));

    if ( (file.isDirectory())||(!(file.exists()))) {
    throw new Exception("Il file richiesto non è stato trovato nell’archivio");
    }

    String contentType = getServletContext().getMimeType(file.getName());

    if (contentType == null) {
    contentType = "application/octet-stream";
    }

    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType(contentType);
    response.setContentLength((int) file.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");


    // Prepare streams.
    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
    // Open streams.
    FileInputStream fi = new FileInputStream(file);

    input = new BufferedInputStream(fi, DEFAULT_BUFFER_SIZE);
    output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

    // Write file contents to response.
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int length;
    while ((length = input.read(buffer)) > 0) {
    output.write(buffer, 0, length);
    }
    } finally {
    // Gently close streams.
    close(output);
    close(input);
    }
    } catch (Exception E) {
    response.getWriter().write("Rilevato problema durante la richiesta del file: " + E.getMessage());
    //response.flushBuffer();
    }
    }

    private static void close(Closeable resource) {
    if (resource != null) {
    try {
    resource.close();
    } catch (IOException e) {
    // Do your thing with the exception. Print it, log it or mail it.
    e.printStackTrace();
    }
    }
    }

    }

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Se non l'hai inserito tu, non puoi semplicemente eliminare tutte le occorrenze di "logger"?

    Analizzando il codice, "fname" è un parametro inviato dal client che contiene il percorso del file da scaricare. Nel tuo caso, visto che il tuo file è nella directory WEB-INF ti consiglio di inviare solo il nome del file e sostituire la creazione dell'oggetto file con l'istruzione

    File file = new File(PERCORSO_DI_WEB-INF + URLDecoder.decode(requestedFile, "UTF-8"));

    in cui devi ovviamente personalizzare con il percorso corretto (relativo o assoluto).
    Attento ai possibili problemi di sicurezza: se dentro fname sono consentiti dei percorsi con ".." un utente potrebbe potenzialmente accedere a qualunque file presente sul server

  3. #3
    Ma una cosa del tipo getResourceAsStream("/WEB-INF/nome_file") della classe ServletContext per ottenere l'input stream del file come la vedi? :master:
    "Na' sedia te vojo tirà!"

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    2

    download file java

    inserendo il codice come indico di seguito non ho più errori ma allesecuzione ottengo la scritta: ("Rilevato problema durante la richiesta del file:timbrate.txt")

    cosa sbaglio??

    per quanto riguarda l'utilizzo di getResourceAsStream caro Brazonet la mia cultura di java non mi permette ancora di capire che cosa intendi....

    mi vergogno per la mia ignoranza ma migliorero'



    /**
    * Servlet implementation class OpenFile
    */
    public class Esempio extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
    public final static Logger logger = Logger.getLogger("Esempio");

    public Esempio() {
    super();
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {


    try
    {




    String requestedFile = request.getParameter("timbrate.txt");
    if (requestedFile == null)
    throw new Exception("timbrate.txt");


    String sid = request.getSession().getId();
    if (sid.equals(request.getParameter("sid")) == false) {
    throw new Exception("Non autorizzato all’utilizzo della servlet");
    }


    File file = new File(URLDecoder.decode(requestedFile, "UTF-8"));
    logger.info("File richiesto: " + URLDecoder.decode(requestedFile, "UTF-8"));

    if ( (file.isDirectory())||(!(file.exists()))) {
    throw new Exception("Il file richiesto non è stato trovato nell’archivio");
    }

    String contentType = getServletContext().getMimeType(file.getName());

    if (contentType == null) {
    contentType = "application/octet-stream";
    }


    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType(contentType);
    response.setContentLength((int) file.length());
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");


    // Prepare streams.
    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
    // Open streams.
    FileInputStream fi = new FileInputStream(file);

    input = new BufferedInputStream(fi, DEFAULT_BUFFER_SIZE);
    output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

    // Write file contents to response.
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int length;
    while ((length = input.read(buffer)) > 0) {
    output.write(buffer, 0, length);
    }
    } finally {
    // Gently close streams.
    close(output);
    close(input);
    }
    } catch (Exception E) {
    response.getWriter().write("Rilevato problema durante la richiesta del file: " + E.getMessage());
    //response.flushBuffer();
    }
    }

    private static void close(Closeable resource) {
    if (resource != null) {
    try {
    resource.close();
    } catch (IOException e) {
    // Do your thing with the exception. Print it, log it or mail it.
    e.printStackTrace();
    }
    }
    }

    }

  5. #5
    Quello che ti volevo dire è che, se il tuo problema è recuperare un file dalla directory WEB-INF della web-app, potresti provare in questo modo:

    codice:
    InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/nome_file");
    
    // Write file contents to response.
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
    int length;
    while ((length = input.read(buffer)) > 0) {
       output.write(buffer, 0, length);
    }
    "Na' sedia te vojo tirà!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.