Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [JDBC] getAbsolutePath() e File.separator

    Salve,

    ho realizzato una servlet di file upload che memorizza i file in una cartella e le info di questi file (nome, percorso, ecc) nel DataBase.
    Funziona, solo che il percorso che viene salvato nel DB MySQL è privo dello slash, cioè mi visualizza C:cartellafile.txt anzicchè C:\cartella\file.txt
    Ecco il codice incriminato:
    Codice PHP:
    String qryIns =  "insert into images values(null, '" +f.getName() +"', '" +file.getAbsolutePath() +"');";
    stmt.executeUpdate(qryIns); 
    Ho letto qualcosa riguardo a File.separatorChar ma nn saprei come integrarlo col codice. Tra l'altro anche volendo fare un tentativo se metto un url fisso come questo:
    Codice PHP:
    ... "C:"+File.separatorChar +"cartella" ... 
    mi visualizza nella tabella un carattere errato tipo | anzicchè \

    qualche suggerimento?
    Grazie dell'attenzione,

    Matteo
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    35
    Prova a fare una replace di "\" con "\\" del percorso del file prima di inserire

  3. #3
    Grazie della risposta.
    Ci avevo pensato anche io ma niente

    Alla fine nel DB me li ignora proprio gli slash
    La cosa curiosa è che se io apro MySQL e inserisco una riga tipo:
    Codice PHP:
    insert into immagini
    values
    (null"C:\test\test.txt"); 
    è tutto ok...quindi dev'essere per forza qualche problema a livello di Java.
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JDBC] getAbsolutePath() e File.separator

    Originariamente inviato da matthew80
    qualche suggerimento?
    O fai tu l'escape dei caratteri speciali (ad esempio con replace/replaceAll sulla stringa che contiene il solo path) o utilizzi altro (ad esempio un PreparedStatement).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Non penso sia questo il problema o forse nn ho capito bene il suggerimento.
    Mi spiego:
    A prescindere dal modo in cui il metodo file.getAbsolutePath() mi restituisce il path (e da una print so che me lo restituisce C:\test\test.txt), anche se nello statement della insert JDBC metto la stringa C:\\test\\test.txt comunque nel database MySQL viene salvata la stringa C:testtest.txt
    Avevo allora pensato che a MySQL non piacessero gli slash, ma il fatto è che se io col QueryBrowser di MySQL faccio
    Codice PHP:
    insert into immagini
    values
    (null'C:\test\test.txt'
    gli slash poi in MySQL si vedono..non riesco proprio a capire.
    Se volete posto tutta la servlet, ma alla fine il codice incriminato penso sia quella riga che ho postato all'inizio.

    Vi prego datemi una mano
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    35
    Prova a postare la servlet e se cel'hai lo script di creazione della tabella

  7. #7
    Grazie infinitamente per l'attenzione
    La Servlet (Da notare che per l'upload sul disco uso le librerie commons-fileupload-1.2.jar e commons-io-1.3.2.jar dell'apache...ma penso la cosa sia irrilevante per il database) :
    Codice PHP:
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.List;
    import java.util.Iterator;
    import org.apache.commons.fileupload.*;
    import java.sql.*;

    public class 
    FileUpload extends HttpServlet {
        public 
    void doPost(HttpServletRequest reqHttpServletResponse res)
                
    throws ServletExceptionIOException{
            
    res.setContentType("text/html");
            
    PrintWriter out res.getWriter();
            
    out.println("<HTML>");
            
    out.println("<HEAD><TITLE>FileUpload Servlet</TITLE></HEAD>");
            
    out.println("<BODY style=\"font-size: 20\">");
            
    DiskFileUpload dfu = new DiskFileUpload();

            try {
                List 
    fileItems dfu.parseRequest(req);
                
    Iterator it fileItems.iterator();
                while (
    it.hasNext()) {
                    
    FileItem f = (FileItemit.next();
                    if (
    f.isFormField()) {
                        
    out.println("Valore del campo testuale " f.getFieldName()
                                + 
    ": " f.getString() + "
    "
    );
                    } else {
                        
    // Scrive su disco
                                            
    File file = new File("C:\\files",
                                
    f.getName());
                        
    f.write(file);
                        
    out.println("File " f.getName() + "salvato in "
                                
    file.getAbsolutePath() + "
    "
    );

                        
    // Aggiorna DataBase
                        
    try{
                                              Class.
    forName("com.mysql.jdbc.Driver");
                                              
    Connection conn DriverManager.getConnection("jdbc:mysql://localhost/test",
                                                                
    "root""root");
                                              
    Statement stmt conn.createStatement();
                                              
    String qryIns =  "insert into immagini values(null, '" +f.getName() +"', '" +
                                              
    file.getAbsolutePath() 
                                              +
    "');";
                                              
    stmt.executeUpdate(qryIns);
                                              
    stmt.close();
                                              
    conn.close();
                                            }catch(
    SQLException sqle){
                                              
    out.println(sqle);
                                            }
                    }
                }
            } catch (
    Exception e) {
                
    out.println("Errore: " e.toString() + "
    "
    );
            }
            
    out.println("</BODY></HTML>");
        }

    Per ora non ho ancora creato lo script di creazione tabella, l'ho fatta a mano. Ecco lo schema:
    Codice PHP:
    -------------------------------------------------
    IMMAGINI
    -------------------------------------------------
    IdImmagini   INT             (PK)
    Nome            VARCHAR
    Percorso        VARCHAR
    ------------------------------------------------- 
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  8. #8
    Aveva ragione andbin...bisognava usare un preparedStatement così da evitare che durante la processione della insert SQL si "mangiasse" gli slash

    PS: per la cronaca
    Codice PHP:
    PreparedStatement ps conn.prepareStatement("insert into immagini values(null, ?, ?)");

    ps.setString(1f.getName());
    ps.setString(2file.getAbsolutePath());
    ps.execute(); 
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    35
    Era un problema di caratteri speciali.

    non ho simulato la servlet, ma un semplice main.
    All'inizio avevo il tuo stesso problema, ma alla fien l'ho risolto:

    codice:
    try{
    	File file = new File("C:\\files", "prova.txt"); 
    	Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "", "");
            Statement stmt = conn.createStatement();
            String path = file.getAbsolutePath().replaceAll("\\\\", "\\\\\\\\");
            String qryIns =  "insert into immagini values(null, '" + file.getName() + "', '" + path + "');";
            stmt.executeUpdate(qryIns);
            stmt.close();
            conn.close(); 
    }catch(ClassNotFoundException e){
            e.printStackTrace();
    }catch(SQLException e){
            e.printStackTrace();
    }
    La replace è decisamente bruttina, ma lo "\" è un carattere speciale e indica che dopo di lui c'è un carattere speciale quindi
    "\\\\" i primi due sono per indicare di sostituire lo \ ma alla replaceAll deve arrivare \\ perchè anche lei prende il carattere dopo lo \
    In pratica se ne pettono quattro per farne arrivare due alla replace che ne interpreterà uno

    neanche provo a spiegare "\\\\\\\\" a parole!

    ti posto anche lo script di creazione della tabella visto che tu non lo avevi e io l'ho dovuta creare.

    Codice PHP:
    CREATE TABLE `IMMAGINI` (
    `
    idINT NOT NULL AUTO_INCREMENT ,
    `
    nomeVARCHAR250 NOT NULL ,
    `
    percorsoVARCHAR250 NOT NULL ,
    PRIMARY KEY ( `id` ) 
    TYPE MYISAM 

  10. #10
    Ciao,

    grazie per il consiglio...solo che ne do uno a te.
    Anzicchè usare gli statement usa i PreparedStatement.
    Infatti usando i PreparedStatement la query viene processata direttamente a livello di DataBase...quindi con gli slash
    E' una soluzione più elegante, veloce e sicura. Ti posto la soluzione con i PreparedStatement:
    Codice PHP:
    PreparedStatement ps conn.prepareStatement("insert into immagini values(null, ?, ?)");

    ps.setString(1f.getName());
    ps.setString(2file.getAbsolutePath());
    ps.execute(); 
    Fammi sapere se anche a te funziona
    A proposito, tu hai realizzato anche la visualizzazione delle immagini? Io ora devo fare oltre all'upload anche una servlet che mi visualizza l'elenco dei collegamenti alle immagini e se ci clicco sopra me le fa visualizzare. A fianco ad ogni collegamento volevo mettere poi un bottone per eliminare quell'immagine...magari se anche tu hai fatto una cosa simile "prendere spunto" schifo non mi fa
    Potremmo lavorarci insieme e fare una cosa carina dimezzando gli sforzi
    Gutta cavat lapidem
    [La goccia scava la pietra]
    ***
    (Ovidio)

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.