添加文件下载

This commit is contained in:
haozq 2025-09-11 13:13:13 +08:00
parent 680ee53f07
commit 1bda8a9957
6 changed files with 202 additions and 2 deletions

View File

@ -0,0 +1,113 @@
package com.bonus.business.controller;
import com.bonus.common.config.MinioConfig;
import com.bonus.common.utils.StringUtils;
import com.bonus.file.minio.MinioUtil;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
/**
* 下载指定路径下的文件
* */
@RestController
@Slf4j
@RequestMapping("/system/files/")
public class DownloadController {
@Resource
private MinioConfig minioConfig;
@Autowired
public MinioUtil minioUtil;
@Resource
private MinioClient minioClient;
/**
* 下载文件 根据文件名
* @param filePath
* @param response
*/
@GetMapping("/download")
public void download(@RequestParam(name = "filePath") String filePath,
HttpServletResponse response){
try {
if(StringUtils.isNotEmpty(filePath)){
if(filePath.startsWith(minioConfig.getUrl())){
filePath=filePath.replace(minioConfig.getUrl()+"/"+minioConfig.getBucketName(),"").trim();
}
fileDownload(filePath,minioConfig.getBucketName(),response);
}else{
System.err.println("文件路径为空");
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 下载文件
* @param fileName
* @param bucketName
* @param response
*/
public void fileDownload(String fileName,
String bucketName,
HttpServletResponse response) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
if (StringUtils.isBlank(fileName)) {
response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
return;
}
outputStream = response.getOutputStream();
// 获取文件对象
inputStream= minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
byte[] buf = new byte[1024];
int length = 0;
response.reset();
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode(fileName.substring(fileName.lastIndexOf("/") + 1), "UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
// 输出文件
while ((length = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, length);
}
System.out.println("下载成功");
inputStream.close();
} catch (Throwable ex) {
response.setHeader("Content-type", "text/html;charset=UTF-8");
String data = "文件下载失败";
try {
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes("UTF-8"));
}catch (IOException e){
e.printStackTrace();
}
} finally {
try {
outputStream.close();
if (inputStream != null) {
inputStream.close();
}}catch (IOException e){
e.printStackTrace();
}
}
}
}

View File

@ -0,0 +1,51 @@
package com.bonus.business.domain;
import lombok.Data;
@Data
public class ProductScreenVo {
private String id;
/**
* 类型id
*/
private String typeId;
/**
* 类型名称
*/
private String typeName;
/**
* 名称
*/
private String name;
/**
* 版本
*/
private String version;
/**
* 迷哦奥数
*/
private String description;
/**
* 背景图
*/
private String image;
/**
* 文件类型
*/
private String fileType;
/**
* 文件路径
*/
private String filePath;
/**
* 源文件名称
*/
private String originalName;
/**
* 桶名称
*/
private String bucketName;
private String url;
}

View File

@ -98,5 +98,9 @@ public class TbProduct extends BaseEntity
private ProductCaseImage image;
private List<ProductScreenVo> videoList;
private List<ProductScreenVo> fileList;
}

View File

@ -1,5 +1,6 @@
package com.bonus.business.mapper;
import com.bonus.business.domain.ProductScreenVo;
import com.bonus.business.domain.TbProduct;
import com.bonus.business.domain.TbProductCase;
import org.apache.ibatis.annotations.Mapper;
@ -18,4 +19,10 @@ public interface ProductScreenMapper {
*/
TbProduct getProductDetails(TbProduct product);
/**
*
* @param vo
* @return
*/
List<ProductScreenVo> getMaterialList(TbProduct vo);
}

View File

@ -1,6 +1,7 @@
package com.bonus.business.service.impl;
import com.bonus.business.domain.ProductCaseImage;
import com.bonus.business.domain.ProductScreenVo;
import com.bonus.business.domain.TbProduct;
import com.bonus.business.domain.TbProductCase;
import com.bonus.business.mapper.ProductMapper;
@ -68,8 +69,21 @@ public class ProductScreenImpl implements ProductScreenService {
}
}
//查询 宣传手册和宣传视频
List<ProductScreenVo> list=mapper.getMaterialList(vo);
List<ProductScreenVo> videoList=new ArrayList<>();
List<ProductScreenVo> fileList=new ArrayList<>();
if(StringUtils.isNotEmpty(list)){
list.forEach(vo1->{
vo1.setUrl(minioConfig.getUrl()+"/"+minioConfig.getBucketName()+vo1.getFilePath());
if("0".equals(vo1.getFileType())){
videoList.add(vo1);
}else {
fileList.add(vo1);
}
});
vo.setVideoList(videoList);
vo.setFileList(fileList);
}
}
}catch (Exception e){
log.error(e.toString());

View File

@ -25,4 +25,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join sys_dict_data sdd on sdd.dict_value=tpt.type_id and sdd.dict_type='tb_product_type'
where tpt.id=#{id}
</select>
<select id="getMaterialList" resultType="com.bonus.business.domain.ProductScreenVo">
select tpm.id, tpm.type_id typeId ,tpm.type_name typeName,tpm.name ,tpm.version ,tpm.description ,tpm.image ,
pmf.file_type fileType ,pmf.file_path filePath, pmf.bucket_name bucketName,pmf.original_name originalName
from tb_promotion_material tpm
left join sys_dict_data sdd on sdd.dict_value=tpm.type_id and sdd.dict_type='tb_product_type'
left join tb_promotion_material_files pmf on tpm.id=pmf.material_id and pmf.del_flag=0 and pmf.type_id=1
where tpm.del_flag=0
<if test="typeId!=null and typeId!=''">
and tpm.type_id=#{typeId}
</if>
</select>
</mapper>