1

Downloading a file from spring controllers

Above is the original article, however i wish to have resume support, means that i can dowmload 51% 1st, and then download another 49% on other time.

environment tomcat 7.0.39

i tried some, but still failed.

here is my code , or maybe you can share your code

            InputStream fis =new FileInputStream(filepath+file_name);

            response.setHeader("Accept-Ranges", "bytes");
            long length = (int) new File(filepath+file_name).length();
            long start = 0;

            if (request.getHeader("Range") != null) 
            {
                response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
                start = Long.parseLong(request.getHeader("Range")
                        .replaceAll("bytes=", "").replaceAll("-", ""));
            }

            response.setHeader("Content-Length", new Long(length - start).toString());
            if (start != 0) 
            {
                response.setHeader("Content-Range", "bytes "
                        + new Long(start).toString() + "-"
                        + new Long(length - 1).toString() + "/"
                        + new Long(length).toString());
            }

            response.setContentType("application/octet-stream");

            fis.skip(start);
            byte[] b = new byte[1024];
            int i;
            while ((i = fis.read(b)) != -1) {
                response.getOutputStream().write(b, 0, i);
                response.flushBuffer();
            }
            fis.close();

fixed, this is my edited version

long length = (int) new File(filepath+file_name).length();
                long start = 0;
                response.setHeader("Accept-Ranges", "bytes");
                response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
                if (request.getHeader("Range") != null) 
                {
                    int x = request.getHeader("Range").indexOf("-");
                    start = Long.parseLong(request.getHeader("Range").substring(0, x)
                            .replaceAll("bytes=", ""));
                }
                response.setHeader("Content-Length", new Long(length - start).toString());

                if(start == 0)
                    response.setHeader("Content-Range", "bytes 0-"        +new Long(length - 1).toString()+"/"+length);
                else
                    response.setHeader("Content-Range", "bytes "+start+"-"+new Long(length - 1).toString()+"/"+length);
                fis.skip(start);
                byte[] b = new byte[1024];
                int i;
                while ((i = fis.read(b)) != -1) {
                    response.getOutputStream().write(b, 0, i);
                    response.flushBuffer();
                }
                fis.close();
Community
  • 1
  • 1
Stupidfrog
  • 2,042
  • 6
  • 25
  • 35

1 Answers1

3

I've build a solution to use HTTP Byte Range with or without Spring. If you are interested, check it out at https://gist.github.com/davinkevin/b97e39d7ce89198774b4

That helps me to use it inside a Spring application using mainly @RestController

Kevin Davin
  • 511
  • 1
  • 4
  • 12