|
|
@@ -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(); |
|
|
|
} |
|
|
|