diff --git a/suimangCApi/src/main/java/com/iformall/controller/UserMouldVideoController.java b/suimangCApi/src/main/java/com/iformall/controller/UserMouldVideoController.java index e928288..39b55d9 100644 --- a/suimangCApi/src/main/java/com/iformall/controller/UserMouldVideoController.java +++ b/suimangCApi/src/main/java/com/iformall/controller/UserMouldVideoController.java @@ -24,6 +24,9 @@ import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.SneakyThrows; +import me.chanjar.weixin.common.error.WxError; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.common.util.fs.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,6 +41,7 @@ import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.List; +import java.util.UUID; @RestController @@ -217,6 +221,7 @@ public class UserMouldVideoController extends BaseController { response.reset(); + File tmpFile = null; OutputStream outputStream = null; try { outputStream = response.getOutputStream(); @@ -240,16 +245,41 @@ public class UserMouldVideoController extends BaseController { //获取响应的输出流 InputStream inputStream = new URL(mouldVideo.getVideoPlayUrl()).openStream(); - response.setHeader("Content-Disposition", "attachment; filename=" - + URLEncoder.encode(mouldVideo.getTitle()+".mp4", "UTF-8")); - //解决编码问题 - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-Type","application/octet-stream"); - - byte[] cache = new byte[1024 * 300]; - int flag; - while ((flag = inputStream.read(cache))!=-1){ - outputStream.write(cache, 0, flag); + //获取从那个字节开始读取文件 + String rangeString = request.getHeader("Range"); + if(StringUtils.isNotBlank(rangeString)){ + tmpFile = FileUtils.createTmpFile(inputStream, mouldVideo.getId().toString(), "mp4"); + RandomAccessFile targetFile = new RandomAccessFile(tmpFile, "r"); + long fileLength = targetFile.length(); + long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); + //设置内容类型 + response.setHeader("Content-Type", "video/mp4"); + //设置此次相应返回的数据长度 + response.setHeader("Content-Length", String.valueOf(fileLength - range)); + //设置此次相应返回的数据范围 + response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength); + //返回码需要为206,而不是200 + response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); + //设定文件读取开始位置(以字节为单位) + targetFile.seek(range); + + byte[] cache = new byte[1024 * 300]; + int flag; + while ((flag = targetFile.read(cache))!=-1){ + outputStream.write(cache, 0, flag); + } + }else{ + response.setHeader("Content-Disposition", "attachment; filename=" + + URLEncoder.encode(mouldVideo.getId()+".mp4", "UTF-8")); + //解决编码问题 + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Type","application/octet-stream"); + + byte[] cache = new byte[1024 * 300]; + int flag; + while ((flag = inputStream.read(cache))!=-1){ + outputStream.write(cache, 0, flag); + } } }catch(MallinkException e){ @@ -260,6 +290,9 @@ public class UserMouldVideoController extends BaseController { outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8)); }finally { + if (tmpFile != null) { + tmpFile.delete(); + } outputStream.flush(); outputStream.close(); }