I have a spring boot app, it has a rest controller that returns strings and text files.
I want to track the download progress on the server side, and push messages to a queue.
When working using a HttpServlet
I simply got an OutputStream
from the HttpResponse
object and pushed the bytes over the socket, calculating the progress as they went, like this:
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));
}
However, with Spring Boot since a lot of that stuff happens under the hood I'm not 100% sure how to approach it.
I've only just started with Spring Boot so go easy on me!
My Controller
currently looks like this:
@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;
}
}
I need to stream files from the server to the client without loading the whole file into memory first. Is this possible with spring REST Controller
s?
How can I access the HttpResponse
object, or is there another way to do it?
HttpResponse object can be fetched and huge file can be downloaded as follows:
@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();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With