H5界面预览或下载文件(Minio或本地文件)

移动端H5下载后端文件 阅读详情
AI摘要

本文介绍了在H5界面中通过Minio服务实现文件预览和下载的两种方法,包括利用Minio自带的预览地址和通过后端获取文件流。同时讨论了安全性及跨域问题。

H5界面预览或下载文件(Minio或本地文件)

一、使用场景

最近有个老系统,需要添加图片预览和文件下载功能,文件保存在Minio上。前端需要在H5界面上,使用js获取文件信息进行图片的预览和文件下载。

先说一下两种情况,本地文件(或者通过IO流获取的文件)只能通过流方式传输到前端,然后进行展示或下载。

但是Minio上的文件,有两种方式可以处理:1.通过Minio自带的预览地址直接展示,比较方便但是会暴露Minio地址(需要安全性考虑),而且一般用于图片之类的可以直接预览的文件格式;2.读取文件流,和本地文件一样传输到前端,然后处理展示或下载,适用于类似文档表格等格式的文件。

可以先看下效果
在这里插入图片描述


话不多说,直接上代码

Minio上传下载相关内容就不赘述了,直接依赖就能用了。

二、Minio自带预览地址

Java代码实现

@RequestMapping("/preViewFile")
@ResponseBody
public String preViewFile(){
    try {
            return minioClient.getPresignedObjectUrl(Method.GET, bucketName, fileName, 60 * 60 * 24,null);
        } catch (Exception e) {
            e.printStackTrace();
        }
}
//第一个参数是请求方式,默认给GET就行,bucketName是保存的桶名称,fileName就是Minio文件保存的地址,第四个参数是链接有效时间,最后一个请求参数,一般给Null就行。

JS代码实现

//按钮随便写一个,onclick调用onPrewViewFile()就行,这里就不赘述了!
function onPrewViewFile() {
	top.$.modal.loading('文件加载中');
	$.ajax({
            cache: true,
            type: "get",
            url: prefix + "/preViewFile",
            data: {},//如果有参数,可以在这里添加请求参数,get也可以改成post
            async: false,
            error : function(request) {
                top.$.modal.closeLoading();
                $.modal.alertError("系统错误");
            },
            success: function(data) { 
                window.open(data, "_blank", "width=800,height=600,left=" + (screen.width/2 - 400) + ",top=" + (screen.height/2 - 300));
                top.$.modal.closeLoading();
            }
        });
}
//JAVA后台返回的值就是地址,所以直接使用window.open打开就可以预览了!!!  "_blank"是新开窗口,再后面是窗口大小和位置,可以自定义(就是style样式)

三、文件流形式展示和下载

JAVA代码实现

	@RequestMapping("/preViewFile2")
    @ResponseBody
    public void preViewFile2(HttpServletResponse response){
        try {
            //本地文件获取流方式
            InputStream inputStream = new FileInputStream(new File("filePath"));
            //Minio获取流方式
            InputStream inputStream = minioClient.getObject(bucketName, "filePath");
            //请求返回的response
            ServletOutputStream outputStream = null;
            try {
                //设置响应头属性,第一个是附件名
                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "inline;filename=" + "fileName");
                //第二个允许外部客户端访问,解决跨域问题等,如果有其他要求,可自行添加
                response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);
                //如果要给前端赋值类型,取消下面这行注释,fileType换成自己的文件类型即可!
                //response.setHeader(HttpHeaders.CONTENT_TYPE,"filType");
                
                //将流写入response的输出流中
                outputStream = response.getOutputStream();
                byte b[] = new byte[1024];
                int n;
                while ((n = inputStream.read(b)) != -1) {
                    outputStream.write(b, 0, n);
                }
                outputStream.flush();
            } catch (Exception e) {
                //有异常抛出去给外层统一处理
                throw e;
            } finally {
                if (inputStream != null) {
                    inputStream.close();
                }
                if (outputStream != null) {
                    outputStream.close();
                }
            }
        }catch (Exception e){
            logger.info("获取文件流报错", e);
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }

//将文件流保存到response中传给前端进行处理

JS代码实现

需要注意的是,图片可以预览,但是文档类的需要其他插件才行,所以这里只做图片预览和文件下载!!!

//按钮随便写一个,onclick调用onPrewViewFile2()就行,这里就不赘述了!

function onPrewViewFile2() {
    	top.$.modal.loading('文件加载中');
    	//新建ajax请求
    	var xhr = new XMLHttpRequest();
    	//请求方式、地址和是否异步,如果是带参数,可以将参数放入最后的xhr.send(params)中即可
    	xhr.open("GET", prefix + "/preViewFile2", true);
    	//相应类型是二进制
        xhr.responseType = "blob";
        xhr.onload = function(e) {
            //如果返回是200,正常
            if (this.status == 200) {
                var blob = this.response;
                //fileType我原本是通过表格名称截取传进方法的,如果不通过方法传进来,则使用下面这条语句
                //也可以通过let contentType = response.headers.get('Content-Type');在后端设置好后,前端获取
                if (fileType == 'jpeg' ||fileType == 'jpg' || fileType == 'png') {
                	//如果是文件格式
                    var reader = new FileReader();
                    reader.onloadend = function () {
                        let image = new Image();
                        //文件地址赋值给image.src(文件地址在后面的reader.readAsDataURL(blob)会生成)
                        image.src = reader.result;
                        //给浏览器的请求地址,如果不给也可以预览,但是chrome浏览器左上角会有个圈圈一直转啊转,转的头晕。
                        //加上请求地址就好了,其他浏览器暂时没看到此问题
                        let url = URL.createObjectURL(blob);
                        //打开新的窗口,设置窗口的样式即可
                        let popupWindow = window.open(url, "_blank", "width=800,height=600,left=" + (screen.width / 2 - 400) + ",top=" + (screen.height / 2 - 300));
                        popupWindow.document.write('<html><head><title>图片预览</title></head><body style="margin: 0; padding: 0; text-align: center;">');
                        popupWindow.document.write('<img src="' + image.src + '" alt="Preview Image" style="max-width: 100%; max-height: 100vh;">');
                        popupWindow.document.write('</body></html>');
                    }
                    //将二进制文件生成对应的数据地址
                    reader.readAsDataURL(blob);
                    top.$.modal.closeLoading();
                } else {
                    //如果是其他格式,则只允许下载
                    //创建一个a链接组件,用于下载
                    let a = document.createElement('a');
                    //将二进制数据创建成可下载的地址
                    let url = URL.createObjectURL(blob);
                    //赋值给a组件
                    a.href = url;
                    
                    //fileName我原本是表格获取,如果没有,则使用下面这两行代码即可
                    //let contentDisposition = response.headers.get('Content-Disposition');
    				//let fileName = contentDisposition.split('filename=')[1];
                    
                    //将文件名赋值给a.download,用于下载名
                    a.download = fileName;
                    //添加上a组件后,主动click实现下载效果。
                    document.body.appendChild(a);
                    a.click();
                    //释放上面创建的url对象,避免内存过大
                    window.URL.revokeObjectURL(url);
                    top.$.modal.msgSuccess("下载成功");
                }
            }else {
                top.$.modal.closeLoading();
                top.$.modal.alertError("请求错误");
            }
        };
		//发送请求
        xhr.send();
}

//注意:如果 top.$.modal.alertError("请求错误")报错,可能是缺少对应的js包,这只是个提示,可以删除掉。

总结

  1. Minio服务本身带有文件预览功能,我们只用获取对应地址直接打开就可以预览了,但是这会暴露Minio地址,如果对安全性有要求,不建议!
  2. 流形式的实现会比较复杂,需要后端获取流后传输到前端进行处理,但是对于预览和下载都可以适用,也是不错的方式。

如果需要多文件上传样式和按钮的,可以看一下另一篇文章,实现多文件的选择和删除。

多文件上传按钮样式

🙉在小小的电脑上面敲呀敲呀敲,写短短的代码,埋小小的坑🙈

🙉在大大的电脑上面敲呀敲呀敲,写大大的代码,埋大大的坑🙈

🙉在特别大的电脑上面敲呀敲呀敲,写特别大的代码,埋特别大的坑🙈

🙉优秀的你肯定是一个不爱写Bug并且爱点赞关注的靓仔吧!🙈

H5和微信小程序实现文件预览功能 不要慌,太阳下山,有月光。月亮西沉,有朝阳。昼夜交替,总有欢喜。 阅读详情

相关推荐

开源一个 Java 17 + Spring Boot 4 + Vue 3 多店铺商城:从微服务架构到 H5/小程序实战

CorSiteHive 是一个基于 Java17、SpringBoot4、SpringCloud、Vue3 和 uni-app 的开源多店铺商城系统,适合学习微服务和前端工程化开发。项目采用模块化设计,后端包含认证、订单、客服等微服务,前端涵盖管理端和用户端(H5/小程序)。核心特点包括多店铺数据隔离、完整的业务链路(商品、订单、售后、营销等)、清晰的代码分层和工程化实践。项目提供本地运行指南,适合开发者学习或二次开发。源码已开源,地址:https://github.com/mlin80110-hue/co

qq_17525509的博客 244

MinIo实现上传下载预览操作指南

MinIo实现上传下载预览操作指南

qq_45721148的博客 7261

前端文件预览全攻略:从PDF到Office的踩坑与封装

浏览器天生只能直接渲染图片、视频、文本和PDF,而docx、xlsx、pptx这类基于Zip压缩与XML描述的格式,浏览器无法直接解析。理解这一点后,文件预览的核心就变成“让浏览器拿到它能理解的数据形式”。借助Blob URL可以绕开附件下载响应头的干扰,通过PDF.js实现跨端稳定渲染,结合docx-preview和SheetJS完成Word与Excel的解析展示,是当前工程实践中最常用的组合。这些技术不仅适用于企业内部的资料管理平台,也广泛用于文档协同、在线教育、SaaS产品等需要在线查阅文件的场景。当

weixin_34199335的博客 390

将Minio获取到的图片直接在页面上预览

【代码】将Minio获取到的图片直接在页面上预览。

该用户名和简介纯属整活 7895

MinIO技术解析与落地实践:从部署到Spring Boot集成避坑指南

对象存储是分布式系统中处理非结构化数据的核心组件,S3协议已成为事实标准。MinIO作为轻量级S3兼容对象存储,以单二进制文件部署和纠删码数据保护机制,为私有云和边缘场景提供低成本方案。纠删码通过将数据切块、计算校验块分散存储,在保障数据可靠性的同时获得比三副本更高的容量利用率,典型的4节点最小集群即可容忍多块磁盘故障。技术价值在于摆脱复杂RAID配置,以Go实现高性能读写。在工程落地中,涉及Spring Boot集成、预签名URL、分片上传、HTTPS代理等典型场景。尤其当数据不能出机房时,需重点考虑权限

weixin_34074740的博客 400

SpringBoot+Uniapp前后端分离校园圈项目实战解析

前后端分离是当前Web开发的普遍模式,通过将前端展示与后端服务解耦,能够有效提升开发效率与系统可维护性。SpringBoot作为后端主流框架,凭借生态成熟、配置简洁等优势,结合MyBatis-Plus可大幅简化数据持久层操作;而Uniapp依托Vue语法,一套代码即可编译到H5、微信小程序及App,成为轻量级跨端应用的首选方案。基于这些技术构建的校园圈项目,覆盖校园集市、表白墙、失物招领、论坛等高频场景,并利用JWT实现接口鉴权,保障用户数据安全。无论是课程设计、毕业设计,还是想系统学习前后端分离开发,这套

weixin_31236101的博客 246

Minio入门系列【13】使用WebUploader上传文件到Minio服务器

前言 在之前介绍了Minio常用功能,以及如何使用JAVA SDK集成Minio,但是没有涉及到前端应该怎么做,接下来介绍如何使用Web组件集成Minio进行文件处理。 WebUploader(摘自官网) 1. 简介 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时

记录知识、锤炼自我 3563

文件服务器mino实现文件存储和文件预览接口

minio实现为文件上传和文件预览,已经集成springboot项目,下载即可用,适合没有任何经验的开发人员。

在页面中预览pdf文件

在页面中预览pdf文件PC端预览pdf文件,使用iframe标签或者embed标签H5移动端预览pdf文件,使用pdf.js和pdfh5.js插件实现 PC端预览pdf文件,使用iframe标签或者embed标签 直接上代码 <iframe src="img/six-month.pdf" frameborder="0"></iframe> <embed src="img/six-month.pdf" type="application/pdf"> H5移动端预览pdf

shizhanguo的博客 532

Windows 10/11 注册表 ProfileImagePath 误改修复:3步恢复用户登录与数据安全

本文详细介绍了Windows 10/11系统中因误改注册表ProfileImagePath键值导致用户无法登录的修复方法。通过3个关键步骤,包括定位SID、安全修复注册表项及验证处理,帮助用户恢复登录并保障数据安全。特别强调了操作顺序的重要性以避免数据丢失,适用于各类Windows用户账户登录错误的紧急处理。

chuoshao2508的博客 403

TortoiseGit之配置密钥

基于github的开发必须要用到rsa密钥,因此需要用到TortoiseGit的putty key generator工具,来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥。

欧文的博客 2077

Minio在IOS环境下播放MP4与MOV格式视频兼容问题处理

springboot+minio处理IOS环境下MP4与MOV格式视频播放问题

qq_35526951的博客 1453

【技术分享】ArcGIS Pro底图色彩优化实战:从DEM到山体阴影的进阶调色技巧

本文深入探讨了在ArcGIS Pro中优化地形底图色彩的进阶技巧。通过分析DEM与山体阴影的直方图,详细讲解了如何运用图层混合、亮度、对比度及伽马值等核心参数进行精细化调色,从而将灰暗平淡的地图转化为层次分明、视觉美观的专业成果。

5b6n7m8的博客 759

对标MinIO的新一代分布式文件系统:小文件性能提升数倍

分布式文件系统是构建海量数据存储的基石,而对象存储凭借S3协议的生态普及,成为云原生应用的首选。然而,在面对数以亿计的小文件时,传统对象存储的元数据管理容易成为性能瓶颈,List操作延迟飙升,CPU占用居高不下。新一代分布式文件系统通过将元数据与数据分离、引入小文件合并写入机制,把多个小对象聚合成大段,大幅降低磁盘inode数量,从而将小文件读写吞吐提升数倍。同时,这类系统在S3接口之外,原生兼容HDFS与POSIX协议,让一个集群同时服务对象存储、大数据分析和传统文件共享,减少多套存储的运维成本。以一套对

weixin_34067102的博客 356

固定翼飞行器建模(一)——六自由度动力学

前两期文章讲完了气动力和气动力矩的模型,本期将来讲解一下六自由度部分的动力学与运动学方程。

2302_80148937的博客 1万+

文件一站式管理——腾讯云轻量搭载ZFile

安全快速的管理和使用你的文件——腾讯云轻量搭建ZFile 项目介绍 此项目是一个在线文件目录的程序, 支持各种对象存储和本地存储, 使用定位是个人放常用工具下载, 或做公共的文件库. 不会向多账户方向开发。 前端基于 h5ai 的原有功能使用 Vue 重新开发、后端采用 SpringBoot, 数据库采用内嵌数据库. 预览地址: https://zfile.jun6.net 文档地址: http://docs.zhaojun.im/zfile 搭建原因 需要随时取用的文件较多,正在使用的设备没

weixin_54652750的博客 1057

上位机图像处理和嵌入式模块部署(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术。而生活当中,则主要以二维码识别、人脸识别、车牌识别和ocr识别为主,这中间深度学习与AI扮演了很重要的角色。过去,市场上的商业收费软件,主要还是以传统设备厂商提供的上位机软件为主,那这一部分是不是结合最新的npu技术,应该做出一些新的东西出来呢?

嵌入式-老费,一个分享专业嵌入式知识的blog 1334

【特别推荐】 今日热门项目推荐:ZFile - 一站式多存储统一管理解决方案

> 还在为管理多个云存储账号而烦恼?ZFile 让你告别繁琐的登录切换,实现真正的文件管理自由! ## ???? 痛点直击:多平台文件管理的困境 你是否也面临这样的困扰? - ???? **账号分散**:阿里云OSS、腾讯云COS、OneDrive、Google Drive...每个平台都要单独登录 - ???? **操作繁琐**:文件查找需要反复切换不同平台,效率低下 - ???? **体验不一**:各平...

gitblog_01409的博客 782

轨道平面系与轨道姿态系

文章摘要: 轨道平面系与轨道姿态系是航天任务中两个核心坐标系。轨道平面系(惯性系)以地心为原点,Z轴沿轨道角动量方向,用于轨道确定和机动规划;轨道姿态系(如LVLH系)以航天器质心为原点,Z轴指向地心,用于姿态控制和对地观测。两者通过旋转矩阵相互转换:轨道平面系基于轨道根数构建,保持静态;而LVLH系随轨道运动连续旋转。前者适用于全局轨道分析,后者支撑局部任务执行。理解二者的定义差异(原点、基准轴、惯性属性)及数学转换关系,对航天器姿态轨道控制系统的设计与操作至关重要。

ScilogyHunter的博客 86

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5864

UNIAPP高性能视频封面提取组件

是一款专为 UniApp 打造的高性能视频封面提取解决方案。旨在解决原生在部分 Android 机型及 H5 环境下,返回值为空的常见痛点。本插件底层采用与相结合。确保在 Android 8.0+ 和 iOS 12.0+ 环境中,均能稳定、高清地截取视频首帧,并自动输出为可直接用于网络上传的本地临时文件路径。

mr_lihuijie的博客 1750

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于SpringMVC的在线文档管理系统3yy4cg58(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

现实意义: 提升协作效率: 系统提供版本控制、在线预览与编辑集成等功能,极大地方便团队协作,缩短文档处理周期。 保障数据安全: 通过精细化的权限体系,确保文档在创建、流转、归档过程中的安全性,防止信息泄露。 实现知识共享: 系统作为统一的文档知识库,结合强大的检索功能,使组织内的知识能够被快速查找和复用,提升整体竞争力。 技术实践价值: 通过完成本项目,可以全面掌握Spring MVC、MyBatis、Solr/Elasticsearch、权限框架等主流Java EE技术的整合与应用,培养完整的项目

h2345678的博客 791

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

基于 SpringBoot 的毕业论文成绩管理系统设计与实现(源码+文档+运行视频+讲解视频)

本文介绍了一个基于SpringBoot+Vue的毕业论文成绩管理系统。针对高校论文管理中存在的人工操作低效、成绩评定标准不统一、数据分散等问题,系统采用SpringBoot+MyBatisPlus+Vue的技术架构,实现了论文全流程数字化管理、多角色权限控制、成绩统计分析等功能。文章详细展示了系统架构设计、技术实现方案、功能测试案例及核心代码片段,并提供了源码获取方式。该系统旨在提高毕业论文管理的规范性和效率,适用于本科/研究生等多层次论文管理需求。

专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。 672

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

基于 SpringBoot 的科研项目验收管理系统设计与实现(源码+文档+运行视频+讲解视频)

本文介绍了一个基于SpringBoot+Vue的科研项目验收管理系统,针对当前科研项目管理中存在的验收流程繁琐、标准不统一、效率低下等问题,提出了一体化数字解决方案。系统采用"SpringBoot+Vue3+MySQL+Redis+MinIO"技术架构,实现了多角色权限管理、文件存储、实时通知等功能。文章展示了系统功能模块、技术实现细节(包括登录验证、用户管理等核心代码)、数据库设计及测试用例。该系统旨在通过数字化手段提升科研项目验收的标准化和效率,为科研管理提供数据支持。

专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。 940

重磅推荐:一个免费开源的在线云盘项目

大家好,我是章鱼猫。我感觉在各种云盘收费越来越贵的情况下,今天给大家推荐的这个开源项目非常好。这个开源项目就是:zfile 。这个开源项目是一个在线文件目录的程序,支持各种对象存储和本地存储,使用定位是个人放常用工具下载,或做公共的文件库。技术栈情况如下:前端基于 h5ai 的原有功能使用 Vue 重新开发了一遍;后端采用 SpringBoot;数据库采用内嵌数据库。整个开源项目支持的功能特性如下...

weixin_40190849的博客 1260
上一篇: Groovy动态加载Java代码的使用方法和工具类
下一篇: H5 多文件Input样式和上传(多次添加,随意删除,名称显示)
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值