2017-09-08 14 views
4

J'ai une application de démarrage de printemps, il a un contrôleur de repos qui renvoie des chaînes et des fichiers texte. Je veux suivre la progression du téléchargement côté serveur et envoyer les messages dans une file d'attente.
Lorsque vous travaillez à l'aide d'un HttpServlet je simplement reçu un OutputStream de l'objet HttpResponse et poussé les octets sur le socket, le calcul du progrès comme ils sont allés, comme ceci:Comment puis-je suivre la progression du téléchargement de fichiers à l'arrière avec Spring Boot?

byte[] buffer = new byte[10]; 
    int bytesRead = -1; 
    double totalBytes = 0d; 
    double fileSize = file.length(); 

    while ((bytesRead = inStream.read(buffer)) != -1) { 
     outStream.write(buffer, 0, bytesRead); 
     totalBytes += bytesRead; 
     queueClient.sendMessage(
       "job: " + job + "; percent complete: " + ((int) (totalBytes/fileSize) * 100)); 

     } 

Cependant, avec le printemps Boot depuis beaucoup de ce truc se passe sous le capot, je ne suis pas sûr à 100% comment l'aborder.

Je viens juste de commencer avec Spring Boot alors allez-y doucement! Mon Controller ressemble actuellement à ceci:

@RestController 
@RequestMapping("/api/v1/") 
public class MyController { 

    @Autowired 
    QueueClient queue; 

    @RequestMapping(value = "info/{id}", method = RequestMethod.GET) 
    public String get(@PathVariable long id) { 
     queue.sendMessage("Client requested id: " + id); 
     return "You requested ID: " + id; 
    } 

    @RequestMapping(value = "files/{job}", method = RequestMethod.GET) 
    public String getfiles(@PathVariable long job) { 
     queue.sendMessage("Client requested files for job: " + job); 
     return "You requested files for job " + job; 
    } 
} 

Je dois recevoir des fichiers du serveur vers le client sans charger le fichier entier en mémoire d'abord. Est-ce possible avec le ressort REST Controller s?
Comment puis-je accéder à l'objet HttpResponse ou existe-t-il un autre moyen de le faire?

Répondre

2

objet HttpResponse peut être fichier récupéré et énorme peut être téléchargé comme suit:

@RequestMapping(value = "/files/{job}", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE) 
public void downloadFile(@PathVariable("job") String job, HttpServletResponse response) { 

//Configure the input stream from the job 
    InputStream file = new FileInputStream(fileStoragePath + "\\" + job); 

    response.setHeader("Content-Disposition", "attachment; filename=\""+job+"\""); 


    int readBytes = 0; 
    byte[] toDownload = new byte[100]; 
    OutputStream downloadStream = response.getOutputStream(); 

    while((readBytes = file.read(toDownload))!= -1){ 
     downloadStream.write(toDownload, 0, readBytes); 
    } 
    downloadStream.flush(); 
    downloadStream.close(); 
} 
+0

Un grand merci! Je ne savais pas que Spring Boot peuplerait 'HttpServletResponse' automatiquement si je l'ai simplement ajouté en paramètre! –