java实现文件的断点续传和断点下载,有知道的交流下。

Python010

java实现文件的断点续传和断点下载,有知道的交流下。,第1张

/**       * 下载服务器已存在的文件       *        * @param request       * @param response       * @param proposeFile       * @throws IOException       * @throws FileNotFoundException       */       private void downloadExistsFile(HttpServletRequest request,               HttpServletResponse response, File proposeFile) throws IOException,               FileNotFoundException {           log.debug("下载文件路径:" + proposeFile.getPath())           long fSize = proposeFile.length()           // 下载           response.setContentType("application/x-download")           String isoFileName = this                   .encodeFilename(proposeFile.getName(), request)           response.setHeader("Accept-Ranges", "bytes")           response.setHeader("Content-Length", String.valueOf(fSize))           response.setHeader("Content-Disposition", "attachment filename="                   + isoFileName)           long pos = 0           if (null != request.getHeader("Range")) {               // 断点续传               response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT)               try {                   pos = Long.parseLong(request.getHeader("Range").replaceAll(                           "bytes=", "").replaceAll("-", ""))               } catch (NumberFormatException e) {                   log.error(request.getHeader("Range") + " is not Number!")                   pos = 0               }           }           ServletOutputStream out = response.getOutputStream()           BufferedOutputStream bufferOut = new BufferedOutputStream(out)           InputStream inputStream = new FileInputStream(proposeFile)           String contentRange = new StringBuffer("bytes ").append(                   new Long(pos).toString()).append("-").append(                   new Long(fSize - 1).toString()).append("/").append(                   new Long(fSize).toString()).toString()           response.setHeader("Content-Range", contentRange)           log.debug("Content-Range", contentRange)           inputStream.skip(pos)           byte[] buffer = new byte[5 * 1024]           int length = 0           while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {               bufferOut.write(buffer, 0, length)           }           bufferOut.flush()           bufferOut.close()           out.close()           inputStream.close()       }  

断点设置方法,当有临时文件时,直接在临时文件中读取上次下载中断时的断点位置。没有临时文件,即第一次下载时,重新设置断点。 rantmpfile.seek()跳转到一个位置的目的是为了让各个断点存储的位置尽量分开。