支持云端录像打包下载
This commit is contained in:
@@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
|
||||
import com.genersoft.iot.vmp.service.bean.DownloadFileInfo;
|
||||
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||
import com.genersoft.iot.vmp.vmanager.cloudRecord.bean.CloudRecordUrl;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
|
||||
import java.util.List;
|
||||
@@ -68,4 +69,8 @@ public interface ICloudRecordService {
|
||||
void deleteFileByIds(Set<Integer> ids);
|
||||
|
||||
void loadMP4File(String app, String stream, int cloudRecordId, ErrorCallback<StreamInfo> callback);
|
||||
|
||||
List<CloudRecordUrl> getUrlListByIds(List<Integer> ids);
|
||||
|
||||
List<CloudRecordUrl> getUrlList(String app, String stream, String callId);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||
import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper;
|
||||
import com.genersoft.iot.vmp.utils.DateUtil;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||
import com.genersoft.iot.vmp.vmanager.cloudRecord.bean.CloudRecordUrl;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -385,4 +386,46 @@ public class CloudRecordServiceImpl implements ICloudRecordService {
|
||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), stringBuilder.toString());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CloudRecordUrl> getUrlListByIds(List<Integer> ids) {
|
||||
List<CloudRecordItem> cloudRecordItems = cloudRecordServiceMapper.queryRecordByIds(ids);
|
||||
if (cloudRecordItems.isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
return getCloudRecordUrl(cloudRecordItems);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<CloudRecordUrl> getUrlList(String app, String stream, String callId) {
|
||||
List<CloudRecordItem> cloudRecordItems = cloudRecordServiceMapper.queryRecordByAppStreamAndCallId(app, stream, callId);
|
||||
if (cloudRecordItems.isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
return getCloudRecordUrl(cloudRecordItems);
|
||||
}
|
||||
|
||||
private List<CloudRecordUrl> getCloudRecordUrl(List<CloudRecordItem> cloudRecordItems) {
|
||||
if (cloudRecordItems.isEmpty()) {
|
||||
return List.of();
|
||||
}
|
||||
List<CloudRecordUrl> resultList = new ArrayList<>();
|
||||
for (CloudRecordItem cloudRecordItem : cloudRecordItems) {
|
||||
CloudRecordUrl cloudRecordUrl = new CloudRecordUrl();
|
||||
cloudRecordUrl.setId(cloudRecordItem.getId());
|
||||
cloudRecordUrl.setFileName(cloudRecordItem.getStartTime() + ".mp4");
|
||||
cloudRecordUrl.setFilePath(cloudRecordItem.getFilePath());
|
||||
if (!userSetting.getServerId().equals(cloudRecordItem.getServerId())) {
|
||||
cloudRecordUrl.setDownloadUrl(redisRpcPlayService.getRecordPlayUrl(cloudRecordItem.getServerId(), cloudRecordItem.getId()).getHttpPath());
|
||||
}else {
|
||||
MediaServer mediaServer = mediaServerService.getOne(cloudRecordItem.getMediaServerId());
|
||||
mediaServer.setStreamIp(mediaServer.getIp());
|
||||
DownloadFileInfo downloadFilePath = mediaServerService.getDownloadFilePath(mediaServer, RecordInfo.getInstance(cloudRecordItem));
|
||||
cloudRecordUrl.setDownloadUrl(downloadFilePath.getHttpPath());
|
||||
}
|
||||
resultList.add(cloudRecordUrl);
|
||||
}
|
||||
|
||||
return resultList;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ import com.genersoft.iot.vmp.media.bean.MediaServer;
|
||||
import com.genersoft.iot.vmp.service.bean.CloudRecordItem;
|
||||
import org.apache.ibatis.annotations.*;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@Mapper
|
||||
public interface CloudRecordServiceMapper {
|
||||
@@ -159,5 +159,14 @@ public interface CloudRecordServiceMapper {
|
||||
" from wvp_cloud_record where id in " +
|
||||
" <foreach collection='ids' item='item' open='(' separator=',' close=')' > #{item}</foreach>" +
|
||||
" </script>")
|
||||
List<CloudRecordItem> queryRecordByIds(Set<Integer> ids);
|
||||
List<CloudRecordItem> queryRecordByIds(Collection<Integer> ids);
|
||||
|
||||
@Select(" <script>" +
|
||||
"select * " +
|
||||
" from wvp_cloud_record where 0=0 " +
|
||||
" <if test= 'app != null '> and app=#{app}</if>" +
|
||||
" <if test= 'stream != null '> and stream=#{stream}</if>" +
|
||||
" <if test= 'callId != null '> and call_id=#{callId}</if>" +
|
||||
" </script>")
|
||||
List<CloudRecordItem> queryRecordByAppStreamAndCallId(String app, String stream, String callId);
|
||||
}
|
||||
|
||||
51
src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java
Normal file
51
src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java
Normal file
@@ -0,0 +1,51 @@
|
||||
package com.genersoft.iot.vmp.utils;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
@Slf4j
|
||||
public class HttpUtils {
|
||||
|
||||
public static boolean downLoadFile(String url, ZipOutputStream zos) {
|
||||
OkHttpClient client = new OkHttpClient();
|
||||
Request request = new Request.Builder()
|
||||
.url(url)
|
||||
.build();
|
||||
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (!response.isSuccessful()) {
|
||||
log.error("下载失败,HTTP 状态码: {}, URL: {}", response.code(), url);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取响应体的输入流
|
||||
InputStream inputStream = null;
|
||||
if (response.body() != null) {
|
||||
inputStream = response.body().byteStream();
|
||||
}
|
||||
if (inputStream == null) {
|
||||
log.error("响应体为空,无法下载文件: {}", url);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 将输入流写入zip文件
|
||||
byte[] buffer = new byte[8192]; // 8KB 缓冲区,提高性能
|
||||
int bytesRead;
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
zos.write(buffer, 0, bytesRead);
|
||||
}
|
||||
|
||||
log.debug("成功下载文件: {}, 大小: {} bytes", url, response.body().contentLength());
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
log.error("下载过程中出错: {}, URL: {}", e.getMessage(), url);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.service.bean.ErrorCallback;
|
||||
import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
|
||||
import com.genersoft.iot.vmp.streamPush.bean.BatchRemoveParam;
|
||||
import com.genersoft.iot.vmp.utils.DateUtil;
|
||||
import com.genersoft.iot.vmp.utils.HttpUtils;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
|
||||
@@ -23,14 +24,14 @@ import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.context.request.async.DeferredResult;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
@@ -357,6 +358,56 @@ public class CloudRecordController {
|
||||
cloudRecordService.deleteFileByIds(ids.getIds());
|
||||
}
|
||||
|
||||
@ResponseBody
|
||||
@GetMapping("/download/zip")
|
||||
public void downloadZipFileFromUrl(HttpServletResponse response, Integer[] ids) {
|
||||
log.info("[下载指定录像文件的压缩包] 查询 ids->{}", ids);
|
||||
List<Integer> arrayList = new ArrayList<>(List.of(ids));
|
||||
List<CloudRecordUrl> cloudRecordItemList = cloudRecordService.getUrlListByIds(arrayList);
|
||||
if (ObjectUtils.isEmpty(cloudRecordItemList)) {
|
||||
log.warn("[下载指定录像文件的压缩包] 未找到录像文件,ids->{}", ids);
|
||||
return;
|
||||
}
|
||||
|
||||
// 设置响应头
|
||||
response.setContentType("application/zip");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=record_" + System.currentTimeMillis() + ".zip");
|
||||
|
||||
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
|
||||
for (CloudRecordUrl recordUrl : cloudRecordItemList) {
|
||||
try {
|
||||
zos.putNextEntry(new ZipEntry(recordUrl.getFileName()));
|
||||
boolean downloadSuccess = HttpUtils.downLoadFile(recordUrl.getDownloadUrl(), zos);
|
||||
if (!downloadSuccess) {
|
||||
log.warn("[下载指定录像文件的压缩包] 下载文件失败: {}", recordUrl.getDownloadUrl());
|
||||
zos.closeEntry();
|
||||
continue;
|
||||
}
|
||||
|
||||
// try (FileInputStream fis = new FileInputStream(recordUrl.getFilePath())) {
|
||||
// byte[] buf = new byte[8192]; // 8KB 缓冲区,提高性能
|
||||
// int len;
|
||||
// while ((len = fis.read(buf)) != -1) {
|
||||
// zos.write(buf, 0, len);
|
||||
// }
|
||||
// }
|
||||
|
||||
zos.closeEntry();
|
||||
} catch (Exception e) {
|
||||
log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", recordUrl.getFileName(), e.getMessage());
|
||||
// 继续处理下一个文件
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("[下载指定录像文件的压缩包] 创建压缩包失败,查询 ids->{}", ids, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/************************* 以下这些接口只适合wvp和zlm部署在同一台服务器的情况,且wvp只有一个zlm节点的情况 ***************************************/
|
||||
|
||||
/**
|
||||
@@ -409,31 +460,45 @@ public class CloudRecordController {
|
||||
if (callId != null && ObjectUtils.isEmpty(callId.trim())) {
|
||||
callId = null;
|
||||
}
|
||||
// 设置响应头
|
||||
response.setContentType("application/zip");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
if (stream != null && callId != null) {
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip");
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip");
|
||||
} else {
|
||||
response.setHeader("Content-Disposition", "attachment;filename=cloud_record_" + System.currentTimeMillis() + ".zip");
|
||||
}
|
||||
List<CloudRecordItem> cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServers, callId, ids);
|
||||
if (ObjectUtils.isEmpty(cloudRecordItemList)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
|
||||
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
|
||||
for (CloudRecordItem cloudRecordItem : cloudRecordItemList) {
|
||||
zos.putNextEntry(new ZipEntry(DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4"));
|
||||
File file = new File(cloudRecordItem.getFilePath());
|
||||
if (!file.exists() || file.isDirectory()) {
|
||||
continue;
|
||||
try {
|
||||
String fileName = DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4";
|
||||
zos.putNextEntry(new ZipEntry(fileName));
|
||||
|
||||
File file = new File(cloudRecordItem.getFilePath());
|
||||
if (!file.exists() || file.isDirectory()) {
|
||||
log.warn("[下载指定录像文件的压缩包] 文件不存在或为目录: {}", cloudRecordItem.getFilePath());
|
||||
zos.closeEntry();
|
||||
continue;
|
||||
}
|
||||
|
||||
try (FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath())) {
|
||||
byte[] buf = new byte[8192]; // 8KB 缓冲区,提高性能
|
||||
int len;
|
||||
while ((len = fis.read(buf)) != -1) {
|
||||
zos.write(buf, 0, len);
|
||||
}
|
||||
}
|
||||
zos.closeEntry();
|
||||
log.debug("[下载指定录像文件的压缩包] 成功添加文件: {}", fileName);
|
||||
} catch (Exception e) {
|
||||
log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", cloudRecordItem.getFilePath(), e.getMessage());
|
||||
// 继续处理下一个文件
|
||||
}
|
||||
FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath());
|
||||
byte[] buf = new byte[2 * 1024];
|
||||
int len;
|
||||
while ((len = fis.read(buf)) != -1) {
|
||||
zos.write(buf, 0, len);
|
||||
}
|
||||
zos.closeEntry();
|
||||
fis.close();
|
||||
}
|
||||
zos.close();
|
||||
} catch (IOException e) {
|
||||
log.error("[下载指定录像文件的压缩包] 失败: 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId, e);
|
||||
}
|
||||
|
||||
@@ -1,32 +1,16 @@
|
||||
package com.genersoft.iot.vmp.vmanager.cloudRecord.bean;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
public class CloudRecordUrl {
|
||||
|
||||
private String filePath;
|
||||
private String playUrl;
|
||||
private String downloadUrl;
|
||||
private String fileName;
|
||||
private int id;
|
||||
|
||||
public String getPlayUrl() {
|
||||
return playUrl;
|
||||
}
|
||||
|
||||
public void setPlayUrl(String playUrl) {
|
||||
this.playUrl = playUrl;
|
||||
}
|
||||
|
||||
public String getDownloadUrl() {
|
||||
return downloadUrl;
|
||||
}
|
||||
|
||||
public void setDownloadUrl(String downloadUrl) {
|
||||
this.downloadUrl = downloadUrl;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
|
||||
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
|
||||
import com.genersoft.iot.vmp.streamPush.service.IStreamPushPlayService;
|
||||
import com.genersoft.iot.vmp.utils.DateUtil;
|
||||
import com.genersoft.iot.vmp.utils.HttpUtils;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
|
||||
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
|
||||
@@ -36,8 +37,6 @@ import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.context.request.async.DeferredResult;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
@@ -391,81 +390,59 @@ public class CameraChannelController {
|
||||
|
||||
/**
|
||||
* 下载指定录像文件的压缩包
|
||||
* @param query 检索内容
|
||||
* @param app 应用名
|
||||
* @param stream 流ID
|
||||
* @param startTime 开始时间(yyyy-MM-dd HH:mm:ss)
|
||||
* @param endTime 结束时间(yyyy-MM-dd HH:mm:ss)
|
||||
* @param mediaServerId 流媒体ID,置空则查询全部流媒体
|
||||
* @param callId 每次录像的唯一标识,置空则查询全部流媒体
|
||||
* @param ids 指定的Id
|
||||
*/
|
||||
@ResponseBody
|
||||
@GetMapping("/record/zip")
|
||||
public void downloadZipFile(HttpServletResponse response, @RequestParam(required = false) String query, @RequestParam(required = false) String app, @RequestParam(required = false) String stream, @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String mediaServerId, @RequestParam(required = false) String callId, @RequestParam(required = false) List<Integer> ids
|
||||
public void downloadZipFile(HttpServletResponse response,
|
||||
@RequestParam(required = false) String app,
|
||||
@RequestParam(required = false) String stream,
|
||||
@RequestParam(required = false) String callId
|
||||
|
||||
) {
|
||||
log.info("[下载指定录像文件的压缩包] 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId);
|
||||
log.info("[下载指定录像文件的压缩包] 查询 app->{}, stream->{}, callId->{}", app, stream, callId);
|
||||
|
||||
List<MediaServer> mediaServers;
|
||||
if (!org.apache.commons.lang3.ObjectUtils.isEmpty(mediaServerId)) {
|
||||
mediaServers = new ArrayList<>();
|
||||
MediaServer mediaServer = mediaServerService.getOne(mediaServerId);
|
||||
if (mediaServer == null) {
|
||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId);
|
||||
}
|
||||
mediaServers.add(mediaServer);
|
||||
} else {
|
||||
mediaServers = mediaServerService.getAll();
|
||||
}
|
||||
if (mediaServers.isEmpty()) {
|
||||
throw new ControllerException(ErrorCode.ERROR100.getCode(), "当前无流媒体");
|
||||
}
|
||||
if (query != null && org.apache.commons.lang3.ObjectUtils.isEmpty(query.trim())) {
|
||||
query = null;
|
||||
}
|
||||
if (app != null && org.apache.commons.lang3.ObjectUtils.isEmpty(app.trim())) {
|
||||
if (app != null && ObjectUtils.isEmpty(app.trim())) {
|
||||
app = null;
|
||||
}
|
||||
if (stream != null && org.apache.commons.lang3.ObjectUtils.isEmpty(stream.trim())) {
|
||||
if (stream != null && ObjectUtils.isEmpty(stream.trim())) {
|
||||
stream = null;
|
||||
}
|
||||
if (startTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(startTime.trim())) {
|
||||
startTime = null;
|
||||
}
|
||||
if (endTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(endTime.trim())) {
|
||||
endTime = null;
|
||||
}
|
||||
if (callId != null && org.apache.commons.lang3.ObjectUtils.isEmpty(callId.trim())) {
|
||||
if (callId != null && ObjectUtils.isEmpty(callId.trim())) {
|
||||
callId = null;
|
||||
}
|
||||
// 设置响应头
|
||||
response.setContentType("application/zip");
|
||||
response.setCharacterEncoding("UTF-8");
|
||||
if (stream != null && callId != null) {
|
||||
response.addHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip");
|
||||
}
|
||||
List<CloudRecordItem> cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServers, callId, ids);
|
||||
if (org.apache.commons.lang3.ObjectUtils.isEmpty(cloudRecordItemList)) {
|
||||
List<CloudRecordUrl> cloudRecordItemList = cloudRecordService.getUrlList(app, stream, callId);
|
||||
if (ObjectUtils.isEmpty(cloudRecordItemList)) {
|
||||
log.warn("[下载指定录像文件的压缩包] 未找到录像文件,app->{}, stream->{}, callId->{}", app, stream, callId);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
|
||||
for (CloudRecordItem cloudRecordItem : cloudRecordItemList) {
|
||||
zos.putNextEntry(new ZipEntry(DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4"));
|
||||
File file = new File(cloudRecordItem.getFilePath());
|
||||
if (!file.exists() || file.isDirectory()) {
|
||||
continue;
|
||||
|
||||
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
|
||||
for (CloudRecordUrl recordUrl : cloudRecordItemList) {
|
||||
try {
|
||||
zos.putNextEntry(new ZipEntry(recordUrl.getFileName()));
|
||||
boolean downloadSuccess = HttpUtils.downLoadFile(recordUrl.getDownloadUrl(), zos);
|
||||
if (!downloadSuccess) {
|
||||
log.warn("[下载指定录像文件的压缩包] 下载文件失败: {}", recordUrl.getDownloadUrl());
|
||||
zos.closeEntry();
|
||||
continue;
|
||||
}
|
||||
zos.closeEntry();
|
||||
} catch (Exception e) {
|
||||
log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", recordUrl.getFileName(), e.getMessage());
|
||||
// 继续处理下一个文件
|
||||
}
|
||||
FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath());
|
||||
byte[] buf = new byte[2 * 1024];
|
||||
int len;
|
||||
while ((len = fis.read(buf)) != -1) {
|
||||
zos.write(buf, 0, len);
|
||||
}
|
||||
zos.closeEntry();
|
||||
fis.close();
|
||||
}
|
||||
zos.close();
|
||||
} catch (IOException e) {
|
||||
log.error("[下载指定录像文件的压缩包] 失败: 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId, e);
|
||||
log.error("[下载指定录像文件的压缩包] 创建压缩包失败,查询 app->{}, stream->{}, callId->{}", app, stream, callId, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -498,7 +475,7 @@ public class CameraChannelController {
|
||||
log.info("[云端录像] 查询URL app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId);
|
||||
|
||||
List<MediaServer> mediaServers;
|
||||
if (!org.apache.commons.lang3.ObjectUtils.isEmpty(mediaServerId)) {
|
||||
if (!ObjectUtils.isEmpty(mediaServerId)) {
|
||||
mediaServers = new ArrayList<>();
|
||||
MediaServer mediaServer = mediaServerService.getOne(mediaServerId);
|
||||
if (mediaServer == null) {
|
||||
@@ -508,22 +485,22 @@ public class CameraChannelController {
|
||||
} else {
|
||||
mediaServers = null;
|
||||
}
|
||||
if (query != null && org.apache.commons.lang3.ObjectUtils.isEmpty(query.trim())) {
|
||||
if (query != null && ObjectUtils.isEmpty(query.trim())) {
|
||||
query = null;
|
||||
}
|
||||
if (app != null && org.apache.commons.lang3.ObjectUtils.isEmpty(app.trim())) {
|
||||
if (app != null && ObjectUtils.isEmpty(app.trim())) {
|
||||
app = null;
|
||||
}
|
||||
if (stream != null && org.apache.commons.lang3.ObjectUtils.isEmpty(stream.trim())) {
|
||||
if (stream != null && ObjectUtils.isEmpty(stream.trim())) {
|
||||
stream = null;
|
||||
}
|
||||
if (startTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(startTime.trim())) {
|
||||
if (startTime != null && ObjectUtils.isEmpty(startTime.trim())) {
|
||||
startTime = null;
|
||||
}
|
||||
if (endTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(endTime.trim())) {
|
||||
if (endTime != null && ObjectUtils.isEmpty(endTime.trim())) {
|
||||
endTime = null;
|
||||
}
|
||||
if (callId != null && org.apache.commons.lang3.ObjectUtils.isEmpty(callId.trim())) {
|
||||
if (callId != null && ObjectUtils.isEmpty(callId.trim())) {
|
||||
callId = null;
|
||||
}
|
||||
MediaServer mediaServer = mediaServerService.getDefaultMediaServer();
|
||||
@@ -535,7 +512,7 @@ public class CameraChannelController {
|
||||
}
|
||||
PageInfo<CloudRecordItem> cloudRecordItemPageInfo = cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServers, callId, null);
|
||||
PageInfo<CloudRecordUrl> cloudRecordUrlPageInfo = new PageInfo<>();
|
||||
if (!org.apache.commons.lang3.ObjectUtils.isEmpty(cloudRecordItemPageInfo)) {
|
||||
if (!ObjectUtils.isEmpty(cloudRecordItemPageInfo)) {
|
||||
cloudRecordUrlPageInfo.setPageNum(cloudRecordItemPageInfo.getPageNum());
|
||||
cloudRecordUrlPageInfo.setPageSize(cloudRecordItemPageInfo.getPageSize());
|
||||
cloudRecordUrlPageInfo.setSize(cloudRecordItemPageInfo.getSize());
|
||||
|
||||
@@ -120,3 +120,4 @@ public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user