def file = params.file as Stringdef path = Constant.FILE_URL + Constant.FOLDER.nanny_video + filedef fileName = file.substring(0, file.indexOf(".") + 1)//只读def randomFile = new RandomAccessFile(new File(path), 'r')def contentLength = randomFile.length()def range = request.getHeader("Range")int start = 0, end = 0if (range != null && range.startsWith("bytes=")) { def values = range.split("=")[1].split("-") start = values[0] as int if (values.length > 1) { end = values[1] as int }}int requestSize = 0if (end != 0 && end > start) { requestSize = end - start + 1} else { requestSize = Integer.MAX_VALUE}byte[] buffer = new byte[4096]response.setContentType('video/mp4')response.setHeader("Accept-Ranges", "bytes")response.setHeader("ETag", fileName)response.setHeader("Last-Modified", new Date().toString())if (range == null) { response.setHeader("Content-length", "${contentLength}")} else { response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT) long requestStart = 0, requestEnd = 0 def ranges = range.split("=") if (ranges.length > 0) { def rangeDatas = ranges[1].split('-') requestStart = rangeDatas[0] as int if (rangeDatas.length > 1) { requestEnd = rangeDatas[1] as int } } long length = 0 if (requestEnd > 0) { length = requestEnd - requestStart + 1 response.setHeader("Content-length", "${length}") response.setHeader("Content-Range", "bytes ${requestStart}-${requestEnd}/${contentLength}") } else { length = contentLength - requestStart response.setHeader("Content-length", "${length}") response.setHeader("Content-Range", "bytes ${requestStart}-${contentLength - 1}/${contentLength}") }}def out = response.outputStreamint needSize = requestSizerandomFile.seek(start)while (needSize > 0) { int len = randomFile.read(buffer) if (needSize < buffer.length) { out.write(buffer, 0, needSize) } else { out.write(buffer, 0, len) if (len < buffer.length) { break } } needSize -= buffer.length}randomFile.close()out.close()代码奉上,一打开就报java.io.IOException: 你的主机中的软件中止了一个已建立的连接。,虽然视频能正常播放,进度条也能拖动,但是日志空间太大了,也捕获不了 |