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

    metodo per scaricare file da java web service

    Buongiono a tutti,
    è il mio primo post spero vivamente di non aver sbagliato sezione. Ho creato un webservice in java, tra i metodi del mio webservice c'è ne uno che mi dovrebbe permettere di scaricare un file.
    L'ho implementato in questa maniera:

    codice:
    @WebMethod(operationName = "download")      public FileOutputStream download(@WebParam(name = "dir") String dir,@WebParam(name = "nome") String nome)      throws IOException {                 File file = new File("C:\\Log\\" + dir + "\\" + nome);                                  FileInputStream fileIn = new FileInputStream(file);                 FileOutputStream outputStream = new FileOutputStream(file);                                  byte[] outputByte = new byte[4096];                 //copy binary contect to output stream                 while(fileIn.read(outputByte, 0, 4096) != -1)                 {                     outputStream.write(outputByte, 0, 4096);                 }                 fileIn.close();                 outputStream.flush();                 outputStream.close();                 return outputStream;      }
    Il seguente codice però mi genera una eccezione e non so veramente piu che pesci prendere.
    Qualcuno ha qualche idea a riguardo?

    grazie mille a tutti in anticipo

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Il codice tutto su una linea sola è illeggibile.

    Vedi quanto ho detto in questa discussione in merito all'utilizzo dei tag CODE:
    http://forum.html.it/forum/showthrea...readid=1423732

    Sarebbe anche opportuno che tu riportassi il tipo di eccezione che riscontri e lo stack trace indicato.

  3. #3
    Hai perfettamente ragione ecco il codice indentato (sperando che si veda cosi ) qualche idea?
    codice:
     @WebMethod(operationName = "download")
         public FileOutputStream download(@WebParam(name = "dir") String dir,@WebParam(name = "nome") String nome)
         throws IOException {
                    File file = new File("C:\\Log\\" + dir + "\\" + nome);
                    
                    FileInputStream fileIn = new FileInputStream(file);
                    FileOutputStream outputStream = new FileOutputStream(file);
                    
                    byte[] outputByte = new byte[4096];
                    //copy binary contect to output stream
                    while(fileIn.read(outputByte, 0, 4096) != -1)
                    {
                        outputStream.write(outputByte, 0, 4096);
                    }
                    //fileIn.close();
                    //outputStream.flush();
                    //outputStream.close();
                    return outputStream;
         }
    Errore:
    codice:
    type: Exception report
    
    message:
    
    descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
    
    exception:
    
    javax.servlet.ServletException: javax.servlet.ServletException
    
    root cause:
    
    javax.servlet.ServletException
    
    root cause:
    
    javax.xml.ws.WebServiceException: Unable to create JAXBContext
    
    root cause:
    
    java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    java.io.FileOutputStream does not have a no-arg default constructor.
    	this problem is related to the following location:
    		at java.io.FileOutputStream
    		at public java.io.FileOutputStream exp.ws.jaxws.DownloadResponse._return
    		at exp.ws.jaxws.DownloadResponse
    
    root cause:
    
    com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    java.io.FileOutputStream does not have a no-arg default constructor.
    	this problem is related to the following location:
    		at java.io.FileOutputStream
    		at public java.io.FileOutputStream exp.ws.jaxws.DownloadResponse._return
    		at exp.ws.jaxws.DownloadResponse
    
    note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Un po' meglio, ma occhio: il tag di chiusura è [/CODE], con lo slash.

    Confesso che non ho familiarità con i Web Services, ma mi sembra di capire che l'errore provenga da qui: exp.ws.jaxws.DownloadResponse e non dal metodo che hai postato (tra l'altro ho qualche dubbio sul suo funzionamento: perchè leggi da un file e poi vai a scrivere dentro lo stesso file?).

  5. #5
    Hai ragione non ha molto senso infatti ho moficato con:
    codice:
    FileOutputStream outputStream = new FileOutputStream(new File("Desktop\\ciao.txt"));
    ma purtroppo la situazione non migliora anche se immagino che concettualemente abbiamo molto piu senso. Il mio webservice ha solo un metodo, il metodo download.

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ma comunque, se è l'utente a dover scaricare il file, perchè lo salvi su disco?

    Ok, hai definito un solo metodo. Però il messaggio di errore

    java.io.FileOutputStream does not have a no-arg default constructor
    mi fa pensare che ci sia dell'altro codice che viene eseguito da qualche altra parte.
    Per quel che vedo, nonostante i dubbi che ho espresso sulla logica e le close() commentate, in termini di linguaggio mi sembra a posto

  7. #7
    Hai ragione le close() commentate in relatà non dovrebbero esserlo, ma nonostante questo l'errore non sta li. A questo punto immagino sia tutto un problema di FileOutputStream. In effetti io non devo salvarlo sul disco del server dove verrà installato il webservice ma bensì nel disco del pc che eseguirà il client, ma a questo punto cosa dovrei passargli come argomento visto che il costruttore di FileOutputStream senza argomenti non esiste? non so proprio concettualemente che fare.

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Allora, come ti ho detto questo è un tipo di tecnologia che non ho mai usato, però lavoro quotidianamente con servlet e JSP. In quell'ambito, quando devo restituire al client un file letto da disco lo carico tramite FileReader e lo invio su un canale di output di "default" che mi è fornito dall'application server. Per farlo trattare in modo corretto dal client (che quindi non deve mostrarlo nel browser, ma predisporsi con la classica finestrella di download) imposto delle intestazioni HTTP.
    Non riesci a identificare nulla di simile?

  9. #9
    Ti ringrazio del tuo tempo Desa. Il problema è un pò piu complesso (se non altro per me )allora io ho bisogno di creare un webservice che mi dia la possibilità di scaricare un file, ora tutto ciò è invocato da un client in c# e purtroppo la scelta di scrivere il web service in java è obbligata dal fatto che una volta completato verrà installato in un server linux e uno win. Ora il client o per lo meno parte del client mi è stato consegnato già sviluppato (e quindi purtroppo non è stata mia la scelta del c#) il mio problema sta appunto nel fatto che l'applicazione (c#) una volta completa verrà installata in un server completamente diverso rispetto a quelli da dove dovrà scaricare i file che mi interessano e da qui la scelta obligata di un webservice. Ho già creato un paio di metodi che mi servono per fare altre due banali operazioni come quella di creare una cartella e un altro metodo che mi restituisce una semplice lista di file. Tutto ciò testato e provato a interfacciare con il mio client c#, tutto liscio. La difficoltà inizia ora che devo scrivere l'ultimo metodo che serve appunto per darmi la possibilità di scaricare un file, mi spiego meglio da mio client gli passo il percorso (che poi sono i due parametri di ingresso della mia funzione)e lui dovrebbe darmi la possibilità di scaricare questo file (che saranno piccoli log testali). Spero di averti chiarito se non altro in parte il problema.

  10. #10
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Nessun problema, è un'occasione anche per me di imparare qualcosa di nuovo.
    Quindi, sintetizzando quello che hai detto: il client fa una richiesta (dammi conferma: stiamo parlando di HTTP?) e si aspetta di ricevere in risposta un file (e, visto che hai già sviluppato anche i metodi di creazione e listing directory, tutto ciò mi ricorda molto da vicino un rudimentale FTP).
    Fermo restando che dovrai implementare dei meccanismi di sicurezza sui parametri (il percorso è specificato come sottodirectory di C:\Log... ma che succede se l'utente passa qualcosa come "..\windows\" ?), quello che resta da capire è come inviare i dati al client.
    Fai così: prova a postare il codice di uno dei due metodi che hai già sviluppato, magari quello di listing. Se il codice è eccessivamente lungo puoi saltare dei pezzi non rilevanti: quello che mi interessa soprattutto è vedere come è fatta la parte in cui restituisci i dati al client.

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.