下载的首要任务就是就是获取到
HttpServletRequest request = this.getRequest();
//获取servlet的请求参数
HttpServletResponse response= this.getResponse();//获取到servlet的返回参数
response.setHeader("Accept-Ranges", "bytes");//表明服务器支持指定范围请求及byte类型的分段请求
response.setHeader("Content-disposition", "attachment; filename=" + encodeFileName(文件名));//对应的解释是:http://www.cnblogs.com/brucejia/archive/2012/12/24/2831060.html
String contentType = servletContext.getMimeType(文件名);//获取到文件名的类型
response.setContentType(contentType != null ? contentType : "application/octet-stream");//根据不同的数据类型来返回不同的数据 if ((request.getHeader("Range")!= null) && (!"".equals(request.getHeader("Range").trim()))//判断请求头是否为空
normalRender(); else rangeRender(); }//对文件名进行编码 private String encodeFileName(String fileName) { try { return new String(fileName.getBytes("GBK"), "ISO8859-1"); } catch (UnsupportedEncodingException e) { } return fileName; } private void normalRender() { this.response.setHeader("Content-Length", String.valueOf(this.file.length()));//设置相应体的长度后写入写出。
InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(this.file)); outputStream = this.response.getOutputStream(); byte[] buffer = new byte[1024]; for (int len = -1; (len = inputStream.read(buffer)) != -1; ) { outputStream.write(buffer, 0, len); } outputStream.flush(); } catch (IOException e) { if (getDevMode()) throw new RenderException(e); if (inputStream != null) try { inputStream.close(); } catch (IOException localIOException1) { } if (outputStream != null) try { outputStream.close(); } catch (IOException localIOException2) { } } catch (Exception e) { throw new RenderException(e); } finally { if (inputStream != null) try { inputStream.close(); } catch (IOException localIOException3) { } if (outputStream != null) try { outputStream.close(); } catch (IOException localIOException4) { } } } private void rangeRender() { Long[] range = new Long[2]; processRange(range); String contentLength = String.valueOf(range[1].longValue() - range[0].longValue() + 1L); response.setHeader("Content-Length", contentLength); response.setStatus(206); StringBuilder contentRange = new StringBuilder("bytes ").append(String.valueOf(range[0])).append("-").append(String.valueOf(range[1])).append("/").append(String.valueOf(this.file.length())); this.response.setHeader("Content-Range", contentRange.toString()); InputStream inputStream = null; OutputStream outputStream = null; try { long start = range[0].longValue(); long end = range[1].longValue(); inputStream = new BufferedInputStream(new FileInputStream(this.file)); if (inputStream.skip(start) != start) throw new RuntimeException("File skip error"); outputStream = this.response.getOutputStream(); byte[] buffer = new byte[1024]; long position = start; int len; while ((position <= end) && ((len = inputStream.read(buffer)) != -1)) { int len; if (position + len <= end) { outputStream.write(buffer, 0, len); position += len; } else { for (int i = 0; (i < len) && (position <= end); i++) { outputStream.write(buffer[i]); position += 1L; } } } outputStream.flush(); } catch (IOException e) { if (getDevMode()) throw new RenderException(e); if (inputStream != null) try { inputStream.close(); } catch (IOException localIOException1) { } if (outputStream != null) try { outputStream.close(); } catch (IOException localIOException2) { } } catch (Exception e) { throw new RenderException(e); } finally { if (inputStream != null) try { inputStream.close(); } catch (IOException localIOException3) { } if (outputStream != null) try { outputStream.close(); } catch (IOException localIOException4) { } } } private void processRange(Long[] range) { String rangeStr = this.request.getHeader("Range"); int index = rangeStr.indexOf(','); if (index != -1) rangeStr = rangeStr.substring(0, index); rangeStr = rangeStr.replace("bytes=", ""); String[] arr = rangeStr.split("-", 2); if (arr.length < 2) { throw new RuntimeException("Range error"); } long fileLength = this.file.length(); for (int i = 0; i < range.length; i++) { if (StrKit.notBlank(arr[i])) { range[i] = Long.valueOf(Long.parseLong(arr[i].trim())); if (range[i].longValue() >= fileLength) { range[i] = Long.valueOf(fileLength - 1L); } } } if ((range[0] != null) && (range[1] == null)) { range[1] = Long.valueOf(fileLength - 1L); } else if ((range[0] == null) && (range[1] != null)) { range[0] = Long.valueOf(fileLength - range[1].longValue()); range[1] = Long.valueOf(fileLength - 1L); } if ((range[0] == null) || (range[1] == null) || (range[0].longValue() > range[1].longValue())) throw new RuntimeException("Range error"); }}