| @@ -24,6 +24,9 @@ import io.swagger.annotations.ApiImplicitParam; | |||||
| import io.swagger.annotations.ApiImplicitParams; | import io.swagger.annotations.ApiImplicitParams; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import lombok.SneakyThrows; | 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.apache.commons.lang3.StringUtils; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -38,6 +41,7 @@ import java.net.URLEncoder; | |||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.UUID; | |||||
| @RestController | @RestController | ||||
| @@ -217,6 +221,7 @@ public class UserMouldVideoController extends BaseController { | |||||
| response.reset(); | response.reset(); | ||||
| File tmpFile = null; | |||||
| OutputStream outputStream = null; | OutputStream outputStream = null; | ||||
| try { | try { | ||||
| outputStream = response.getOutputStream(); | outputStream = response.getOutputStream(); | ||||
| @@ -240,16 +245,41 @@ public class UserMouldVideoController extends BaseController { | |||||
| //获取响应的输出流 | //获取响应的输出流 | ||||
| InputStream inputStream = new URL(mouldVideo.getVideoPlayUrl()).openStream(); | 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){ | }catch(MallinkException e){ | ||||
| @@ -260,6 +290,9 @@ public class UserMouldVideoController extends BaseController { | |||||
| outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8)); | outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8)); | ||||
| }finally { | }finally { | ||||
| if (tmpFile != null) { | |||||
| tmpFile.delete(); | |||||
| } | |||||
| outputStream.flush(); | outputStream.flush(); | ||||
| outputStream.close(); | outputStream.close(); | ||||
| } | } | ||||