Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di ZZZZ
    Registrato dal
    Feb 2002
    Messaggi
    127

    Esporre un file su un web service REST

    Ciao a tutti,
    ho la necessità di creare un URL da cui è possibile scaricare un file.
    Ho provato a scrivere questo
    codice:
    @RequestMapping(value = "/std/service/file", method = RequestMethod.GET)
    private byte[] file(String pathFileInput) {
    
        //setto il path per provare a leggere un file
    pathFileInput = "C:\\test.doc";
        //fine settaggio di prova
    byte[] responseBinaryFile = new byte[0];
        try {
           responseBinaryFile = Files.readAllBytes(new File(pathFileInput).toPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return responseBinaryFile;
    }
    Ma quando provo ad eseguire, all'indirizzo http://localhost:8080/std/service/file mi viene visualizzato in stringa il file binario (come se aprissi il file da blocco note).
    Io vorrei che il browser mi aprisse la schermata di download.
    Mi aiutate?
    Grazie

    Giovanni

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da ZZZZ Visualizza il messaggio
    Io vorrei che il browser mi aprisse la schermata di download.
    Mi aiutate?
    Premesso che se il file è relativamente piccolo, "tirar su" un array di byte con l'intero contenuto del file non è un grosso problema. Diverso sarebbe se il file fosse di svariati megabyte (e specialmente se ci fossero molte richieste concorrenti per un download di quel tipo).
    Ci sono comunque altre tecniche per non dover tirar su l'intero file.

    Comunque dato che usi Spring, ti basta indicare il content-type in uscita usando l'attributo produces di @RequestMapping.

    @RequestMapping(value = "/std/service/file", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)

    (MediaType è il org.springframework.http.MediaType, da importare, chiaramente). Invece di mettere la costante di MediaType, puoi anche mettere direttamente "application/octet-stream" , è lo stesso.
    Questo, di fatto, "forza" un browser a fare il download.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di ZZZZ
    Registrato dal
    Feb 2002
    Messaggi
    127
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Comunque dato che usi Spring, ti basta indicare il content-type in uscita usando l'attributo produces di @RequestMapping.


    @RequestMapping(value = "/std/service/file", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    Funziona! Il browser scarica direttamente il file binario. Grazie


    Quote Originariamente inviata da andbin Visualizza il messaggio
    Invece di mettere la costante di MediaType, puoi anche mettere direttamente "application/octet-stream" , è lo stesso.
    Dove dovrei mettere "application/octet-stream"?


    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premesso che se il file è relativamente piccolo, "tirar su" un array di byte con l'intero contenuto del file non è un grosso problema. Diverso sarebbe se il file fosse di svariati megabyte (e specialmente se ci fossero molte richieste concorrenti per un download di quel tipo).
    Ci sono comunque altre tecniche per non dover tirar su l'intero file.
    Le richieste sono univoche per singolo file: espongo il servizio per scaricare il file e mando l'URL un servizio esterno che si scarica il file dal percorso che ho esposto.

    Ora dovrei creare l'URL con /nomefiledascaricare per creare gli URL dinamici.
    Se hai un consiglio anche su questo, sarò felice.
    Ho provato a scrivere questo (non so se esiste una soluzione migliore...)
    codice:
    @RequestMapping(value = "/std/service/file/{filenameToSearch}"
                ,method = RequestMethod.GET
                ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
        )
        private byte[] getFileToSign(@PathVariable String filenameToSearch) {
            byte[] responseBinaryFile = new byte[0];
            File pathFolder = new File("C:\\");
            File[] files = pathFolder.listFiles();
            int nFileInFolder = files.length;
            if (files != null) {
                for (int i = 0; i < nFileInFolder; i++) {
                    String pathFile = files[i].toString();
                    String filename = pathFile.substring(pathFile.lastIndexOf("\\") + 1, pathFile.length());
                    if (pathFile != null && pathFile.length() > 0) {
                        if(filename.contains(filenameToSearch))
                        try {
                            responseBinaryFile = Files.readAllBytes(new File(pathFile).toPath());
                            break;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            return responseBinaryFile;
        }

  4. #4
    Utente di HTML.it L'avatar di ZZZZ
    Registrato dal
    Feb 2002
    Messaggi
    127
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Comunque dato che usi Spring, ti basta indicare il content-type in uscita usando l'attributo produces di @RequestMapping.

    @RequestMapping(value = "/std/service/file", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    Funziona! Il browser scarica direttamente il file binario. Grazie
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Invece di mettere la costante di MediaType, puoi anche mettere direttamente "application/octet-stream" , è lo stesso.
    Dove dovrei mettere "application/octet-stream"?
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premesso che se il file è relativamente piccolo, "tirar su" un array di byte con l'intero contenuto del file non è un grosso problema. Diverso sarebbe se il file fosse di svariati megabyte (e specialmente se ci fossero molte richieste concorrenti per un download di quel tipo).
    Ci sono comunque altre tecniche per non dover tirar su l'intero file.
    Le richieste sono univoche per singolo file: espongo il servizio per scaricare il file e mando l'URL un servizio esterno che si scarica il file dal percorso che ho esposto.


    Ora dovrei creare l'URL con /nomefiledascaricare per creare gli URL dinamici.
    Se hai un consiglio anche su questo, sarò felice.
    Ho provato a scrivere questo (non so se esiste una soluzione migliore...)
    codice:
    @RequestMapping(value = "/std/service/file/{filenameToSearch}"
                ,method = RequestMethod.GET
                ,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE
        )
        private byte[] getFileToSign(@PathVariable String filenameToSearch) {
            byte[] responseBinaryFile = new byte[0];
            File pathFolder = new File("C:\\");
            File[] files = pathFolder.listFiles();
            int nFileInFolder = files.length;
            if (files != null) {
                for (int i = 0; i < nFileInFolder; i++) {
                    String pathFile = files[i].toString();
                    String filename = pathFile.substring(pathFile.lastIndexOf("\\") + 1, pathFile.length());
                    if (pathFile != null && pathFile.length() > 0) {
                        if(filename.contains(filenameToSearch))
                        try {
                            responseBinaryFile = Files.readAllBytes(new File(pathFile).toPath());
                            break;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            return responseBinaryFile;
        }

  5. #5
    Utente di HTML.it L'avatar di ZZZZ
    Registrato dal
    Feb 2002
    Messaggi
    127
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Premesso che se il file è relativamente piccolo, "tirar su" un array di byte con l'intero contenuto del file non è un grosso problema. Diverso sarebbe se il file fosse di svariati megabyte (e specialmente se ci fossero molte richieste concorrenti per un download di quel tipo).
    Ci sono comunque altre tecniche per non dover tirar su l'intero file.
    Credo d'aver bisogno di altre tecniche per tirar su il file.
    Restituirlo come array di byte non va bene. Ho provato a restituire l'oggetto File, ma il browser non lo capisce
    Il mio metodo, cosa dovrebbe restituire per far ottenere il file lato web?

Tag per questa discussione

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.