Come faccio a salvare e recuperare un’immagine sul mio server in una webapp java

Qui con un’altra domanda su Immagini (che sembra essere più difficile di quanto ho previsto inizialmente) Sto lavorando su un’app java Web con JSF 2.0 (apache myFaces) e voglio che questa app sia in grado di caricare un’immagine su una destinazione su il server su cui verrà eseguito. Ho un Windows r2 2008 Server che esegue un Db mySQL, ma non voglio memorizzare l’immagine nel db, preferirei salvarlo da qualche parte nel server e quindi salvare il percorso come una stringa nel db.

Mi è stato detto che questo è il modo migliore, ma non riesco a trovare un esempio su come salvarlo sul server. Eseguo l’app su Apache tomcat Server come file WAR. quindi non so se devo salvare il file in un percorso sul drive del server (cioè C: \ images) o una cartella speciale nel progetto stesso (all’interno dei file java, html) qualsiasi aiuto è molto apprezzato . Sono completamente perso e sono rimasto bloccato tutto il giorno cercando di capirlo.

Il codice che uso per caricare l’immagine nella class java è questo (per gentile concessione di CodyS):

InputStream is = uploadedFile.getInputStream(); byte[] buffer = new byte[(int) uploadedFile.getSize()]; is.read(buffer); File f = new File("C:\\temp\\" + this.patient.getPk() + ".jpeg"); f.createNewFile(); FileOutputStream fos = new FileOutputStream(f); fos.write(buffer); //This is where I write it to the C Drive fos.close(); is.close(); 

invece di scriverlo sul mio drive C lo farò girare sul server, ma dove dovrei memorizzare l’immagine per recuperarla in un secondo momento e visualizzarla in un file xhtml? Spero di essere chiaro su ciò di cui ho bisogno, fammi sapere se non lo sono e cercherò di spiegarlo in un altro modo.

invece di scriverlo sul mio drive C lo farò girare sul server, ma dove dovrei memorizzare l’immagine per recuperarla in un secondo momento e visualizzarla in un file xhtml?

Dipende da quanto controllo hai sulla configurazione del server. Ideale sarebbe configurare un percorso fisso all’esterno della cartella webapps di Tomcat. Ad esempio, /var/webapp/upload . È ansible impostare questo percorso come argomento VM o variabile di ambiente in modo che la propria applicazione Web possa recuperarlo a livello di codice senza dover modificare il codice.

Ad esempio, quando si specifica come argomento VM -Dupload.location=/var/webapp/upload , è ansible completare il caricamento come segue:

 Path folder = Paths.get(System.getProperty("upload.location")); String filename = FilenameUtils.getBaseName(uploadedFile.getName()); String extension = FilenameUtils.getExtension(uploadedFile.getName()); Path file = Files.createTempFile(folder, filename + "-", "." + extension); try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } String uploadedFileName = file.getFileName().toString(); // Now store it in DB. 

Per quanto riguarda la pubblicazione del file, l’ideale sarebbe aggiungere la posizione di caricamento come un separato a Tomcat. Per esempio

  

In questo modo puoi accedervi direttamente da http://example.com/uploads/foo-123456.ext

Se non hai il controllo sulla configurazione del server, allora, l’archiviazione nel DB o l’invio a un host di terze parti come Amazon S3 è la soluzione migliore.

Guarda anche:

  • Come fornire un percorso relativo nella class File per caricare qualsiasi file?
  • Servire dati affidabili

Prenderò in considerazione la possibilità di consentire all’utente di caricare direttamente su Amazon S3. Amazon offre un servizio per questo . Usando quel servizio, il cliente posterebbe un modulo con il file direttamente su S3. Una volta che il file è arrivato, Amazon reindirizzerà il client a uno dei tuoi endpoint per confermare che i dati sono arrivati, comunicandoti i dettagli pertinenti.

I benefici sono:

  1. Il tuo server non impiega molto tempo a ricevere file enormi. Puoi passare i tuoi cicli di CPU su qualcosa di un po ‘più interessante.
  2. La disponibilità garantita memorizzandola su S3 è probabilmente migliore di quella che si otterrebbe memorizzandola nella propria casella di Windows.
  3. Scala. Ad un certo punto, il tuo filesystem esaurirà lo spazio. (Oppure raggiungi il limite di ciò che puoi memorizzare in una cartella).

Suggerisco di salvare le immagini in una sottocartella presente nella cartella WEB-INF dell’applicazione. Ricorda che quando usi Tomcat, i tuoi file WAR verranno estratti automaticamente. Questo approccio ha anche il vantaggio che è sempre ansible migrare la propria applicazione su un altro server, è sufficiente salvare il percorso relativo alla cartella WEB-INF nel DB.