React + SpringBoot + Minio实现文件的预览

思路:后端提供接口,从minio获取文件的预览链接,返回给前端,前端使用组件进行渲染展示

  1. 这里我从minio获取文件预览地址用到了一个最近刚开源的项目,挺好用的,大伙可以试试,用法也很简单
    官网:https://x-file-storage.xuyanwu.cn/#/
    Gitee:https://gitee.com/dromara/x-file-storage?_from=gitee_search
bash 复制代码
<dependency>
    <groupId>org.dromara.x-file-storage</groupId>
    <artifactId>x-file-storage-spring</artifactId>
    <version>2.1.0</version>
</dependency>


dromara:
  x-file-storage:
    default-platform: minio-1 # 默认存储平台
    minio:
      - platform: minio-1 # 存储平台标识
        enable-storage: true  # 启用存储
        access-key: vsrfrBr3maUFmserLMp9
        secret-key: i2ehAdnwos1eWu0ZNqkMgJdhsGZSF8PSp03mG86x
        end-point: http://XXX.XXX.XXX.XXX:9000
        bucket-name: file
        domain: ?? # 访问域名,注意"/"结尾,例如:http://minio.abc.com/abc/
        base-path:  # 基础路径
  1. 以下是后端接口主要逻辑,把viewUrl给前端返回就行,格式类似于,文件名后面拼接着认证信息什么的,后端工作到这里就完成了
    "http://XXX.XXX.XXX.XXX:9000/file/65c416eecc50d2508a5fb86b.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256\&X-Amz-Credential=vsrfrBr3maUFmserLMp9%2F20240208%2Fus-east-1%2Fs3%2Faws4_request\&X-Amz-Date=20240208T025942Z\&X-Amz-Expires=604800\&X-Amz-SignedHeaders=host\&X-Amz-Signature=b31d4ce4142bb0626f6e45a9448255124c125bf4f2e6e2be506e4f736909dadc"
bash 复制代码
@Autowired
private FileStorageService fileStorageService;

// 上传到minio返回的文件名称
String minioName = sysFile.getMinioName();
FileInfo fileInfo = new FileInfo().
setPlatform("minio1").setFilename(minioName);
// 获取一周后的时间作为过期时间
DateTime dateTime = DateUtil.offsetWeek(DateUtil.date(), 1);
String viewUrl = fileStorageService.generatePresignedUrl(fileInfo, dateTime);
// 把文件名放进响应头,前端获取文件后缀需要用
response.setHeader("Content-Disposition", "attachment;filename=" +  URLEncoder.encode(minioName, "utf8"));
  1. 下面开始前端工作,找到一个渲染的组件,react-file-viewer
  2. yarn add react-file-viewer
  3. 核心代码,fileType(文件类型,比如:docx、pdf等等),filePath(文件的下载地址)这两个属性是必需的
bash 复制代码
<FileViewer
	fileType={fileViewType}
	filePath={fileViewUrl}
	errorComponent={CustomErrorComponent}
	onError={onError}
	style={{ width: "100%" }}
/>
  1. 文件类型可以从响应头中拿到
bash 复制代码
const content = response.headers["content-disposition"].split("=");
const fileName = decodeURI(content[1]); // 设置下载的文件名
const ext = getFileExtension(fileName);
setFileViewType(ext);

// 获取文件名中的后缀
function getFileExtension(fileName: string): string {
  /*只获取后缀*/
  var suffix = fileName.substring(fileName.lastIndexOf(".") + 1); //txt
  return suffix;
}
  1. 看看效果,两个按钮是antdv 的 Modal组件带的

  2. 恭喜你,至此已经完成

  3. 多提一嘴,x-file-storage用来上传下载也很方便

bash 复制代码
// 上传
FileInfo upload = fileStorageService.of(multipartFile).upload();
// 下载
FileInfo fileInfo = new FileInfo()
.setPlatform("minio-1").setFilename(sysFile.getMinioName());
Downloader download = fileStorageService.download(fileInfo);
相关推荐
红尘散仙2 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
陈随易4 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
ZhengEnCi4 小时前
Agent 工具怎么折叠海量输出才「爽」:Trae、Claude Code 的渐进式披露设计原理
前端·agent
IT_陈寒7 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala7 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
ikoala7 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
计算机毕设定制辅导-无忧学长9 小时前
《基于微信小程序的居家医疗陪护预约系统设计与实现》
java·spring boot·微信小程序·uniapp·居家医疗陪护预约系统
去伪存真10 小时前
AI Agent Harness 深度测评与技术选型实战
前端·agent
FRing0312 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
疯华整猫15 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构