springboot+vue+minio实现文件上传加前端展示

minio的部署和idea的配置可看这篇文章

芋道 Spring Boot 对象存储 MinIO 入门 | 芋道源码 —— 纯源码解析博客

在基本的后端上传逻辑之下,增加了前端的返回值:

后端代码如下:

 @PostMapping("/upload")
    public JSONObject upload(@RequestParam("file") MultipartFile file) throws Exception {
        // 上传
        String path = UUID.randomUUID().toString() ; // 文件名,使用 UUID 随机
        String res = null;
        try {
            // 检查'my-bucketname'是否存在。
            boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
            if (found) {
                System.out.println("mybucket exists");
                minioClient.putObject(PutObjectArgs.builder()
                        .bucket(bucket) // 存储桶
                        .object(path) // 文件名
                        .stream(file.getInputStream(), file.getSize(), -1) // 文件内容
                        .contentType(file.getContentType()) // 文件类型
                        .build());
            } else {
                System.out.println("mybucket does not exist");
            }
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }

        res = String.format("%s/%s/%s", endpoint, bucket, path);
        System.out.println(res);
        JSONObject result = new JSONObject();
        result.put("path", res);
//        if (!res.isEmpty())
        return CommonUtil.successJson(result);
//        else
//            return CommonUtil.errorJson("上传失败");
    }

返回给前端的是拼接好的http链接,前端采用的是upload的方式获取并展示,里面有一个重要的点就是action接口要写对,否则会产生跨域错误,在正常的接口前面加一层api,before-upload是定义上传时文件的类型,文件大小等,http-request是一个自定义上传函数,可以在JS中获取后端的返回值,content是定义上传类型,因为前端是直接返回图片,所以要将show-file-list的值设为false

HTML中的代码

  <el-upload action="/api/xxx/upload" :show-file-list="showFileList"
                            :before-upload="beforeUpload" :http-request="uploadSectionFile"
                            content="multipart/form-data">
                            <el-button class="edit_btn" style="border: none; ">
                                <div>
                                  
                                    <div class="testStyle">打开文件</div>
                                </div>
                            </el-button>
</el-upload>
<img :src=imgSrc><!-- 单页展示图片 -->

JS中的代码:

data中添加如下

 showFileList: false,//控制上传显示出现的列表
 imgSrc: '',//图片显示URL

methods中的函数:

 uploadSectionFile(param) {
            //打开文件显示文件
            var fileObj = param.file;
            var form = new FormData();
            // 文件对象
            form.append("file", fileObj);
            this.api({
                url: "/xxxr/upload",
                method: "post",
                data: form
            }).then((data) => {
                this.imgSrc = data.path;
            })
        },

 beforeUpload(file) {
            //上传前对文件的控制
            const isJPG = file.type === 'image/png';//限制上传类型(类型里面没有ofd)
            const isLt2M = file.size / 1024 / 1024;//限制上传文件大小
        },

上传图片格式文件即可前端动态展示。

逻辑可能还存在不足之处,日后改进。

若大佬有直接前端点击文件后端处理返回前端展示,不经过minio的方式还请赐教。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用 Spring Boot + Vue 实现 KKFileView 与 MinIO 文件预览的具体操作步骤: 1. 首先,需要安装并启动 MinIO,可以从官网下载并安装对应平台的版本。 2. 创建一个新的 MinIO 存储桶,并将需要预览的文件到该存储桶中。 3. 使用 Spring Boot 创建一个新的 Web 应用程序,并添 MinIO 的客户端依赖,如下所示: ```xml <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>6.1.0</version> </dependency> ``` 4. 创建一个 MinIO 客户端实例,并使用该实例获取存储桶中的文件 URL,如下所示: ```java import io.minio.MinioClient; import io.minio.errors.MinioException; public class MinioUtils { private static final String ENDPOINT = "your-minio-endpoint"; private static final String ACCESS_KEY = "your-minio-access-key"; private static final String SECRET_KEY = "your-minio-secret-key"; private static final String BUCKET_NAME = "your-bucket-name"; private static final MinioClient minioClient; static { try { minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY); } catch (Exception e) { throw new RuntimeException(e); } } public static String getFileUrl(String fileName) { try { return minioClient.presignedGetObject(BUCKET_NAME, fileName); } catch (Exception e) { throw new RuntimeException(e); } } } ``` 其中,getFileUrl 方法用于获取指定文件MinIO 存储桶中的 URL。 5. 使用 Vue 创建一个新的 Web 界面,并引入 KKFileView 的 JavaScript 文件,如下所示: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件预览</title> <script src="https://cdn.koalaxiezi.com/kkfileview/4.0.6/kkfileview.min.js"></script> <link href="https://cdn.koalaxiezi.com/kkfileview/4.0.6/kkfileview.min.css" rel="stylesheet"> </head> <body> <div id="app"></div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script src="app.js"></script> </body> </html> ``` 6. 在 Vue 的 app.js 文件中,使用 Axios 获取 MinIO 存储桶中的文件 URL,并将其递给 KKFileView 进行预览,如下所示: ```javascript import axios from 'axios' import KKFileView from 'kkfileview' new Vue({ el: '#app', created() { axios.get('/getFileUrl?fileName=test.pdf').then((response) => { KKFileView.open(response.data) }) } }) ``` 其中,getFileUrl 接口用于返回指定文件MinIO 存储桶中的 URL,response.data 是从接口返回的 URL。 7. 在 Spring Boot 应用程序中,创建 getFileUrl 接口,用于返回指定文件MinIO 存储桶中的 URL,如下所示: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class FileController { @GetMapping("/getFileUrl") public String getFileUrl(@RequestParam String fileName) { return MinioUtils.getFileUrl(fileName); } } ``` 8. 启动 Spring Boot 应用程序和 Vue Web 界面,访问 Vue Web 界面,即可在线预览 MinIO 存储桶中的文件。 需要注意的是,为了保证文件访问的安全性,需要在 MinIO 中设置适当的访问权限,确保只有授权的用户才能访问存储桶中的文件。同时,KKFileView 也提供了一些安全设置,如设置访问密码等,可以进一步文件访问的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值