feat(ai-sample): 添加样本批量下载功能
- 在AiSampleController中新增/download接口支持批量下载 - 实现downloadSamples方法处理单个和多个样本下载逻辑 - 集成HttpUtil下载文件并使用ZipOutputStream打包多文件 - 添加文件服务器地址配置注入
This commit is contained in:
@@ -11,10 +11,12 @@ import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.annotation.security.PermitAll;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import static com.tashow.cloud.common.pojo.CommonResult.success;
|
||||
@@ -91,4 +93,13 @@ public class AiSampleController {
|
||||
PageResult<AiSampleDO> pageResult = aiSampleService.getAiSamplePage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, AiSampleRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/download")
|
||||
@Operation(summary = "批量下载样本")
|
||||
@Parameter(name = "ids", description = "样本ID列表(逗号分隔)", required = true, example = "1,2,3")
|
||||
@PermitAll
|
||||
public void downloadSamples(@RequestParam("ids") String ids, HttpServletResponse response) throws IOException {
|
||||
aiSampleService.downloadSamples(ids, response);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.tashow.cloud.common.serializer.ImgJsonSerializer;
|
||||
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
|
||||
import lombok.*;
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ public interface AiSampleMapper extends BaseMapperX<AiSampleDO> {
|
||||
"<where>" +
|
||||
"AND t.deleted =0"+
|
||||
" <if test=\"pageReqVO.tagIds != null and pageReqVO.tagIds != ''\">" +
|
||||
" AND FIND_IN_SET(r.sample_tag_id,${pageReqVO.tagIds}) " +
|
||||
" AND FIND_IN_SET(r.sample_tag_id, '${pageReqVO.tagIds}') " +
|
||||
" </if>" +
|
||||
" <if test=\"pageReqVO.sampleName != null and pageReqVO.sampleName != ''\">" +
|
||||
" AND t.sample_name LIKE CONCAT('%',#{pageReqVO.sampleName},'%')" +
|
||||
|
||||
@@ -3,8 +3,10 @@ package com.tashow.cloud.ai.service.aisample;
|
||||
import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
|
||||
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
|
||||
import com.tashow.cloud.common.pojo.PageResult;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.Valid;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -69,5 +71,12 @@ public interface AiSampleService {
|
||||
*/
|
||||
PageResult<AiSampleDO> getAiSamplePage(AiSamplePageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 批量下载样本
|
||||
*
|
||||
* @param ids 样本ID列表(逗号分隔)
|
||||
* @param response HTTP响应
|
||||
*/
|
||||
void downloadSamples(String ids, HttpServletResponse response) throws IOException;
|
||||
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package com.tashow.cloud.ai.service.aisample;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
|
||||
@@ -17,15 +18,20 @@ import com.tashow.cloud.common.util.object.BeanUtils;
|
||||
import com.tashow.cloud.fileapi.api.file.FileApi;
|
||||
import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.SneakyThrows;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
/**
|
||||
* 样本库 Service 实现类
|
||||
@@ -44,7 +50,8 @@ public class AiSampleServiceImpl implements AiSampleService {
|
||||
private AiSampleTagRelateMapper aiSampleTagRelateMapper;
|
||||
@Resource
|
||||
private FileApi fileApi;
|
||||
|
||||
@Value("${file-server}")
|
||||
private String fileServer;
|
||||
|
||||
@Override
|
||||
@SneakyThrows
|
||||
@@ -175,4 +182,30 @@ public class AiSampleServiceImpl implements AiSampleService {
|
||||
return new PageResult<>(aiSampleDOPageResult.getRecords(), aiSampleDOPageResult.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void downloadSamples(String ids, HttpServletResponse response) throws IOException {
|
||||
List<AiSampleDO> samples = aiSampleMapper.selectBatchIds(Arrays.asList(ids.split(StrUtil.COMMA)));
|
||||
|
||||
if (samples.size() == 1) {
|
||||
// 单个文件直接下载
|
||||
AiSampleDO sample = samples.get(0);
|
||||
byte[] bytes = HttpUtil.downloadBytes(fileServer + sample.getSampleFilePath());
|
||||
response.setContentType(sample.getSampleMineType());
|
||||
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(sample.getSampleName(), "UTF-8"));
|
||||
response.getOutputStream().write(bytes);
|
||||
} else {
|
||||
// 多个文件打包成ZIP
|
||||
response.setContentType("application/zip");
|
||||
response.setHeader("Content-Disposition", "attachment; filename=samples.zip");
|
||||
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
|
||||
for (AiSampleDO sample : samples) {
|
||||
byte[] bytes = HttpUtil.downloadBytes(fileServer + sample.getSampleFilePath());
|
||||
zos.putNextEntry(new ZipEntry(sample.getSampleName()));
|
||||
zos.write(bytes);
|
||||
zos.closeEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user