SpringBoot 3 | Vue 3 | MinIO 图片预览

前后端分离实现文件上传下载

前面的文章分享了使用两种方式实现文件上传,从本文开始分享从文件服务器 Minio 上获取文件,本文分享最简单的预览。由于文件类型很多(office、pdf、图片等),不同类型的文件在浏览器中展示支持程度不同,而本系列的重点是“前端 – 后端 – Minio”的交互,故本文只演示图片的预览,关于 office 等的预览、kkFilePreview 等在本系列末尾再抽空分享。

一、后端实现

1.1

定义接口

由于 Minio 中的 Bucket 默认安全策略是 Private,直接通过文件名和文件服务器地址无法直接访问文件,需要通过 Minio API 来进行访问,故定义一个接口供前端预览图片。

接口定义如下:

接口 URL:/file/preview 

请求方式:GET 

请求参数:

    – bucketName:桶名称

    – fileName:文件名 

接口返回:临时访问路径URL

FileController:

@GetMapping("preview")@ResponseBodypublic String preview(@NotEmpty(message = "bucketName 不能为空") String bucketName,                      @NotEmpty(message = "fileName 不能为空") String fileName) {    return fileUtils.preview(fileName, bucketName);}

preview 接口需要输入两个参数:Bucket 名称和文件名,返回文件的临时访问路径(该临时访问路径一段时间后会失效)。

1.2

实现预览方法

Fileutils 中封装 preivew 预览方法:该方法调用 Minio API 提供的分配临时访问链接的方法,获取文件的临时访问路径:

/** * 文件预览 * * @param bucketName    桶名称 * @param fileName      文件名 * @return              文件临时访问URL */public String preview(String bucketName, String fileName) {    GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()            .bucket(bucketName)            .object(fileName)            .method(Method.GET)            .build();    try {        return minioClient.getPresignedObjectUrl(args);    } catch (Exception e) {        e.printStackTrace();    }    return null;}

二、前端实现

2.1

调用后端接口

file-service.ts 中定义 preivew 方法,调用后端接口:

...class FileService {  ...  /**   * 获取文件临时访问路径   */  public preview (fileName: string, bucketName: string): Promise {    const params = { fileName, bucketName }    return request.get('/file/preview', { params })  }}...

2.2

界面调用预览图片

调用 fileService 中的 preview 方法,可以获取到文件的临时访问路径,在 img 标签的 src 设置改属性便可以直接显示图片:

<template>  <div>    <h1>前后端分离 文件上传下载测试h1>
    <el-input v-model="bucketName">el-input>    ...    <el-input v-model="fileName">el-input>    <el-button type="primary" @click="onPreview">预览图片el-button>    <img :src="imgSrc" v-if="imgSrc">  div>template>
<script lang="ts" setup>...import { fileService } from '@/service/file-service'...
const fileName = ref('1688019150811_26796288.png')const imgSrc = ref('')
const onPreview = async () => {  console.log(fileName.value)  const resp = await fileService.preview(fileName.value, bucketName.value)  console.log(resp)  if (resp) {    imgSrc.value = resp   }}script>

在输入框中输入正确的 bucketName 和 fileName,点击“预览图片”按钮后,会获取到图片的临时路径,并在 img 标签中显示该图片。

2.3

新选项卡中打开

在这里,咱们可以暂时利用浏览器的能力,在新选项卡中打开接口返回的临时 url,间接实现文件下载。

界面上添加一个测试按钮:

type="primary" @click="onPreviewDownload">下载-预览链接</el-button>

实现点击事件:

const onPreviewDownload = async () => {  const resp = await fileService.preview(fileName.value, bucketName.value)  if (resp) {    window.open(resp, '_blank')  }}

本文内容比较简单(但优雅的文件预览并不是一个简单的功能,兼容各种文件类型、PC 端各种浏览器、移动端,甚至钉钉浏览器与微信浏览器都有一些差异,优雅哥后续会逐步分享),下文分享基于文件流的文件下载。

 

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=14630,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?