package froala.editor.video; import java.io.File; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.tika.Tika; /** * 동영상 스트리밍 전송 * @since 2021. 6. 18. * @author 임종호 *
* ----------------------- * 개정이력 * 2021. 6. 18. 임종호 : 최초작성 **/ public class StreamingResponse { public static final int DEFAULT_BUFFER_SIZE = 204800; private static final long DEFAULT_EXPIRE_TIME = 604800000L; public Range write(File file, HttpServletRequest request, HttpServletResponse response) throws IOException { Range range = null; String fileName = (String) request.getAttribute("originFileNm"); String rangeStr = request.getHeader("range"); if (rangeStr != null) { if (rangeStr.endsWith("-")) { rangeStr = rangeStr + (file.length() - 1); } int idxm = rangeStr.trim().indexOf("-"); range = new Range(Long.parseLong(rangeStr.substring(6, idxm)), Long.parseLong(rangeStr.substring(idxm + 1)), file.length()); long partSize = 0; if (range.getStart() > 0) { range.setPart(true); } range.setPartSize(partSize); } else { range = new Range(0L, file.length() - 1, file.length()); } range.setPartSize(range.getEnd() - range.getStart() + 1); if (range.getEnd() == 0) { range.setEnd(range.getStart() + DEFAULT_BUFFER_SIZE - 1); } if (range.getEnd() > range.getTotal() - 1) { range.setEnd(range.getTotal() - 1); } String eTag = file.getName() + "_" + file.lastModified(); // mime type 지정 Tika tika = new Tika(); String mime = tika.detect(file); response.setContentType(mime); response.reset(); response.setStatus(range.isPart() ? HttpServletResponse.SC_PARTIAL_CONTENT : HttpServletResponse.SC_OK); response.setHeader("Content-Range", "bytes " + range.getStart() + "-" + range.getEnd() + "/" + range.getTotal()); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Content-Length", "" + range.getPartSize()); response.setBufferSize(DEFAULT_BUFFER_SIZE); response.setHeader("Content-Disposition", "inline;filename=\"" + fileName + "\""); response.setHeader("ETag", eTag); response.setDateHeader("Last-Modified", file.lastModified()); response.setDateHeader("Expires", System.currentTimeMillis() + DEFAULT_EXPIRE_TIME); return range; } }