Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Gestire campi BLOB di mySQL

    Devo realizzare un'applicazione che dialoghi con una tabella mySQL.
    La tabella (che chiamerò table1 ) è così composta:

    id INTEGER PRIMARY KEY AUTO-INCREMENT,
    descrizione TEXT,
    attach BLOB,
    fkey INTEGER.

    La tabella in questione raccoglie delle entità di tipo "Intervento" di una sottospecie di forum. :)

    Premetto che ho letto quasi tutti i mille post in merito alla gestione di campi BLOB.
    Quello che non ho capito è:
    - Come faccio ad inserire in un form la componente "Sfoglia" (per il caricamento dell'allegato all'atto dell'inserimento)?
    - Tutti gli esempi che ho visto necessitavano di un campo nomefile... che utilizzavano per capire l'estensione del file. Non è possibile risalire all'estensione del file attraverso il contenuto del campo BLOB? Oppure sono costretto ad inserire una nuova colonna fileName?
    - Come scrivo nel db?
    - Come leggo?
    - Quando leggo il file, vorrei che l'utente potesse salvarlo dove gli pare. Come faccio?

    Grazie a tutti.
    Think global, act local.

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Hai le idee un po' confuse su quel che un campo BLOB va a contenere, e poi non si capisce se tu stia progettando un'applicazione WEB (JSP, Servlet o che) oppure un'applicazione stand alone.

    Applicazione Web:

    hai bisogno di un form e input file. Ti consiglio di scaricare e installare FileUpload di commons (c'è un mio post sul forum a riguardo, credo) per facilitarti e di molto la gestione del file.

    Applicazione Stand-Alone: JFileChooser è il componente che ti consente di aprire la finestra di dialogo per la scelta di un file. Trovi miliardi di esempi qui sul forum così come nel tutorial su swing su sito della Sun (http://java.sun.com e cerca Swing Tutorial)

    Veniamo al campo BLOB nello specifico: è fatto apposta per contenere solo il bytecode del file che vuoi andare a salvarci. Puoi sempre aggiungere un altra colonna alla tabella per salvarci il nome (che sia il nome del file originale oppure il nome con cui l'utente vuole andare a salvare il file non ha importanza).

    In un post di un paio di giorni fa (come in molti altri) c'era l'esempio di come gestire un campo Blob: si fa una preparedstatement e ci si spara il file in stream (o lo si legge come stream):

    http://forum.html.it/forum/showthrea...readid=1047858

    contiene il codice che era presente (o è tutt'ora presente) nella "learning" del citato sito di java.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Ti ringrazio Andrea.
    L'applicazione la sto scrivendo in Java, quindi standalone.

    Quando l'utente clicca sul pulsante di sfoglia, seleziona un file e preme ok/apri.
    Con il JFileChooser... giusto?
    La casella di testo avrà il percorso del file all'interno.
    Dopo non mi resta che utilizzare il percorso per leggere il file di partenza e copiarlo nel db.

    Ora invece parliamo dell'utente che vuole consultare il contenuto della tabella.

    Preme su un tasto, per esempio download, e dovrebbe comparire una JFileChooser che gli consente di salvare il file da qualche parte. L'estensione dovrebbe essere quella del file originale, magari il nome no.
    Per far questo devo necessariamente aggiungere un campo alla tabella(e se tenessi traccia della sola estensione?).
    Quando l'utente ha fatto click su salva nella popup di caricamento del percorso, troverà il file pronto nel percorso desiderato.

    Ho reso l'idea?
    Spero di si.


    Grazie ancora.
    Think global, act local.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Per quanto riguarda il download devi aggiungere uno step in più: il JFileChooser ti fa scegliere il posto dove salvare e l'eventuale nome da dare al file, però la lista dei file "scaricabili" la devi fornire andando a fare una query a DB e recuperando quanto meno il nome (anche per quello ti torna utile avere una colonna col nome del file) e id (per andare poi a fare una query per il campo BLOB). A quel punto JFileChooser avrà i dati da salvare con nome e percorso desiderati.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Si si, quello è tutto fatto.

    Grazie ancora.
    Think global, act local.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    buon proseguimento allora.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Sono riuscito ad effettuare l'inserimento.
    All'atto del caricamento (devo far scaricare l'allegato), purtroppo non posso utilizzare questo statement
    Codice PHP:
    InputStream fin rs.getBinaryStream("img"); 
    Poichè per questioni di ingegnerizazzione del codice non posso chiamare direttamente la connessione dal file java nel quale mi trovo.

    Ho a disposizione un ResultSet frutto di una "SELECT * FROM table;".
    Se provo a castare:
    Codice PHP:
    Object attach tm.getValueAt(jTable1.getSelectedRow(), 2);
    InputStream fin = (InputStreamattach
    la seconda riga mi da un'errore di cast.

    Come faccio da un ResultSet a giungere ad un oggetto di tipo InputStream?
    Grazie.
    Think global, act local.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Originariamente inviato da index
    [...]
    Poichè per questioni di ingegnerizazzione del codice non posso chiamare direttamente la connessione dal file java nel quale mi trovo.

    Ho a disposizione un ResultSet frutto di una "SELECT * FROM table;".
    Se provo a castare:
    Codice PHP:
    Object attach tm.getValueAt(jTable1.getSelectedRow(), 2);
    InputStream fin = (InputStreamattach
    la seconda riga mi da un'errore di cast.

    Come faccio da un ResultSet a giungere ad un oggetto di tipo InputStream?
    Grazie.
    Prova a postare più codice, non mi è molto chiara la situazione
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Nel file java dove mi trovo, ho soltanto un ResultSet.
    E da quello devo andare a beccare il record che l'utente ha selezionato da una jTable che li mostra tutti.

    Ho la jTable e un tasto "download" unico.
    Quando l'utente clicca su questo tasto (se è stata selezionata qualche riga) mi compare la jFileChooser (solo per directory) nel quale vado a salvare il file conil suo nome originale (ho aggiunto il campo nomefile nel DB).

    Il problema è che non so se esiste qualche metodo che mi becca direttamente il mio record sul ResultSet passandogli solo per esempio il valore del campo id.

    Come faccio?
    Think global, act local.

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Bhè, vediamo la query che fai... se si può ottimizzare, per esempio, per creare la tabella è discretamente inutile fare una query del tipo:
    codice:
    SELECT * FROM tabella
    se un campo, come nel tuo caso, è un BLOB... ti basta id, nome_file e descrizione. Poi una volta scelto il file, recuperi l'id e fai una query del genere:
    codice:
    SELECT nome_file,bytecode FROM tabella WHERE id=id_recuperato
    fintanto che hai una decinda di file da qualche decina di KB ciascuno non ti accorgi della differenza, ma se domani ti trovi con 5 o sei file da centinaia di mega, ti eviti di caricarteli tutti.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.