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

    Leggere un file da allegare all'interno di un jar

    Buongiorno,

    ho necessita di mandare dei file in java.
    L'invio dell'email con allegato funziona benissimo, il problema che per allegare devo passargli il percorso, ma vorrei leggere il file all'interno del mio jar

    Cercando mi è sembrato di capire che bisogna usare questa sintassi:

    codice:
    getClass().getResource("/nome_paccheto/test.pdf");
    oppure
    ("/nome_paccheto/test.pdf");

    Nel primo caso restituisce percorso c:\\... \nomeprogramma.jar\nome_pacchetto\test.pdf

    In entrambi i casi restituisce che il file non è stato trovato.

    Ho provato anche un po di varianti, ma nulla.

    Mi sapreste aiutare?

    Ringrazio Anticipatamente

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se stai cercando di leggere qualcosa che si trova dentro ad un JAR non stai leggendo un file (che è un'entità del File System), ma una risorsa (nient'altro che un mucchio di byte che fanno parte di un file).

    Quindi, bisogna vedere in che modo stai cercando di accedere a tale risorsa e in che modo stai cercando di inviare la mail (tramite comunicazione SMTP grezza o se tramite API di più alto livello, come JavaMail).

    Quindi, spiega cosa utilizzi per la spedizione della mail e mostra come stai cercando di leggere i dati del file da allegare.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Ho fatto in questo modo:


    codice:
            Message msg = new MimeMessage(session);
            msg.setText(testoMessagio);
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            
            messageBodyPart.setText("Testo dell'email");
            
            Multipart multipart = new MimeMultipart();
            
            multipart.addBodyPart(messageBodyPart);
            messageBodyPart = new MimeBodyPart();
            String file = ("test.pdf");
            //String file = getClass().getResource("/pacchetto/test.pdf");
            String fileName = "Test.pdf";
            DataSource source = new FileDataSource(file);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(fileName);
            multipart.addBodyPart(messageBodyPart);
            
            msg.setContent(multipart);
    il file test l'ho messo nel pacchetto.
    Ultima modifica di thunderBest; 10-11-2015 a 15:21

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok, stai usando JavaMail.
    Come detto, una risorsa dentro ad un JAR non è un file, quindi non è possibile usare un FileDataSource (perchè, appunto, questo pretende un file sul FileSystem).

    Per "ovviare", la libreria JavaMail (che stai usando) ha a disposizione un apposito DataSource: ByteArrayDataSource. Un ByteArrayDataSource può essere costruito tramite un InputStream (vedi i costruttori di tale classe). E' sufficiente, quindi, procedere in questo modo:


    codice:
    InputStream is = getClass().getResourceAsStream("/pacchetto/test.pdf");
    DataSource source = new ByteArrayDataSource(is, "application/pdf");
    messageBodyPart.setDataHandler( new DataHandler(source) );
    ...

    PS: perchè metti le parentesi ad esempio in questa istruzione?

    codice:
    String file = ("test.pdf");

    Ciao.
    Ultima modifica di LeleFT; 10-11-2015 a 15:49
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Funziona perfettamente!!! Meriti tanti +++

    Grazie mille!! Continuavo a ostinarmi cercando di richiamare il file.

    Le parentesi ("test.pdf") erano dovuto a prove che facevo quando richiamavo getClass()...

    Grazie Ancora!!!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Aggiungo che mi pare esiste la soluzione attraverso il URL. DataHandler ha un costruttore

    DataHandler(URL url)

    E di una risorsa puoi ottenere il suo URL proprio tramite getResource()

    Dovrebbe funzionare ... non ho mai provato così con questo scenario.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Avevo provato con un toURI(), ma non riuscivo lo stesso... non so se poi sbagliavo cmq qualcosa d'altro.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Aggiungo che mi pare esiste la soluzione attraverso il URL. DataHandler ha un costruttore

    DataHandler(URL url)

    E di una risorsa puoi ottenere il suo URL proprio tramite getResource()

    Dovrebbe funzionare ... non ho mai provato così con questo scenario.

    Confermo.
    Avevo visto quel costruttore di DataHandler (ed anche URLDataSource che viene internamente usato da quel costruttore), ma mi rimaneva il dubbio che non riuscisse a gestire correttamente il MIME Type. Ho fatto una prova velocissima e ho visto che lo decodifica tranquillamente, quindi sì, può essere usato direttamente:


    codice:
    messageBodyPart.setDataHandler( new DataHandler(getClass().getResource("/pacchetto/test.pdf")) );
    ...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    @LeleFT: grazie per la prova/conferma. Magari potrà tornare utile anche a me ..
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    ottimo!

    Grazie Ancora!

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.