视频等大文件java断点续传处理

import com.teleone.ferryportal.model.bo.Storage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @ClassName : VideoDownloadController
 * @Description : 断点续传
 * @Author : keven
 * @Date: 2020-03-30 11:50
 */
@RestController
@Api(tags = ("断点续传接口"))
@Slf4j
public class VideoDownloadController {

  @Value("${ferry.path.htmlFile}")
  private String htmlFilePath;

  @GetMapping("/download/video/{fileName}")
  @ApiOperation("断点续传記錄")
  public void download(@PathVariable("fileName") String fileName, HttpServletRequest request, HttpServletResponse response) {
    Storage storage = new Storage();
    String pathName = htmlFilePath + fileName;
    storage.setPathName(pathName);
    log.info("断点续传处理中");
    downloadVideo(storage, request, response);

  }


  public static void downloadVideo(Storage storage, HttpServletRequest request, HttpServletResponse response) {
    File downloadFile = new File(storage.getPathName());
    int contentLength = Integer.parseInt(String.valueOf(downloadFile.length()));

    try {
      RandomAccessFile randomFile = new RandomAccessFile(downloadFile, "r");
      Throwable var6 = null;

      try {
        ServletOutputStream out = response.getOutputStream();
        Throwable var8 = null;

        try {
          String range = request.getHeader("Range");
          int start = 0;
          int end = 0;
          if (range != null && range.startsWith("bytes=")) {
            String[] values = range.split("=")[1].split("-");
            start = Integer.parseInt(values[0]);
            if (values.length > 1) {
              end = Integer.parseInt(values[1]);
            }
          }

          int requestSize;
          if (end != 0 && end > start) {
            requestSize = end - start + 1;
          } else {
            requestSize = 2147483647;
          }

          response.setContentType("video/mp4");
          response.setHeader("Accept-Ranges", "bytes");
          if (range == null) {
            response.setHeader("Content-length", String.valueOf(contentLength));
          } else {
            response.setStatus(206);
            long requestStart = 0L;
            long requestEnd = 0L;
            String[] ranges = range.split("=");
            if (ranges.length > 1) {
              String[] rangeDatas = ranges[1].split("-");
              requestStart = (long) Integer.parseInt(rangeDatas[0]);
              if (rangeDatas.length > 1) {
                requestEnd = (long) Integer.parseInt(rangeDatas[1]);
              }
            }

            long length = 0L;
            if (requestEnd > 0L) {
              length = requestEnd - requestStart + 1L;
              response.setHeader("Content-length", "" + length);
              response.setHeader("Content-Range", "bytes " + requestStart + "-" + requestEnd + "/" + contentLength);
            } else {
              length = (long) contentLength - requestStart;
              response.setHeader("Content-length", "" + length);
              response.setHeader("Content-Range", "bytes " + requestStart + "-" + (contentLength - 1) + "/" + contentLength);
            }
          }

          int needSize = requestSize;
          byte[] buffer = new byte[4096];
          randomFile.seek((long) start);

          while (needSize > 0) {
            int len = randomFile.read(buffer);
            out.write(buffer, 0, len);
            if (len < buffer.length) {
              break;
            }

            needSize -= buffer.length;
          }
        } catch (Throwable var43) {
          var8 = var43;
          throw var43;
        } finally {
          if (out != null) {
            if (var8 != null) {
              try {
                out.close();
              } catch (Throwable var42) {
                var8.addSuppressed(var42);
              }
            } else {
              out.close();
            }
          }

        }
      } catch (Throwable var45) {
        var6 = var45;
        throw var45;
      } finally {
        if (randomFile != null) {
          if (var6 != null) {
            try {
              randomFile.close();
            } catch (Throwable var41) {
              var6.addSuppressed(var41);
            }
          } else {
            randomFile.close();
          }
        }

      }
    } catch (IOException var47) {
      log.error("read file error ", var47);
    }

  }
}

 

发布了15 篇原创文章 · 获赞 2 · 访问量 1573

猜你喜欢

转载自blog.csdn.net/qq_31207917/article/details/105416303