【前后端实现文件下载或浏览】

news2024/11/19 7:26:00

前后端实现文件下载或浏览

  • 背景
    • 前端
    • 后端java
    • 其他
      • IO流分两种;字符流&字节流

背景

前端html\js\css,使用a标签或者iframe,笔者使用window.open(url)—重新打开标签页地址栏显示的接口路径;后端返回客户端[HttpServletResponse] 文件流(以附件的方式[attachment]下载,或者在线方式[inline]浏览)。
笔者编译平台为x5,因此调用.j文件才可以使用 HttpServletResponse

前端

var getFileStream = function(subPath, ywlx, operateType) {
		console.log("the URL of dzzzRow: "+ subPath);
		if (!subPath) return;
				var realFileName = subPath.substr(subPath.lastIndexOf("/")+1);
				// 提交前需要进行URL转换,在URL上补足bsessionid等必要信息
				var url = require.toUrl("$UI/sybdc/service/simpleFileStore.j?bsessionid=" + this.getContext().getBSessionID());
				// 用get方式传参
				url = url 
					+ "&subPath=" + subPath 
					+ "&realFileName=" + realFileName
					+ (ywlx? "&ywlx="+ywlx:"")
					+ (operateType? "&operateType="+ operateType:"");
				window.open(url);
	}


// 调用方式:浏览
this.getFileStream(row.val("URL"), "dzzz");
// 调用方式:下载
this.getFileStream(row.val("URL"), "dzzz", "download");

后端java

当ywlx = “dzzz”时,前端传入的路径若文件不存在则会抛异常,读者可根据自己的业务需求另作处理(若文件不存在重新生成文件或者返回前端文件不存在);注意:这里下载与浏览使用的get方式调接口;new File对象并未与磁盘交互,而是在使用File对象的函数(file.exist()、getPath()等等)时才读写磁盘;这里使用的字节文件流

/**
	 * get为获取文件 浏览或者下载
	 **/
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String operateType = request.getParameter("operateType");
		if ("copy".equals(operateType)) {
			copyFile(request, response);
		} else {
			getFile(request, response);
		}
	}
	
	
	private static final int BUFFER_SIZE = 32768 * 8;

	private static void getFile(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String ownerID = request.getParameter("ownerID"); //对应的是表 WW_SLCLB 中的主键clid
		String realFileName = URLEncoder.encode(request.getParameter("realFileName"), "utf-8");
		String storeFileName = request.getParameter("storeFileName");
		String operateType = request.getParameter("operateType");
		String subPath = request.getParameter("subPath");
		String ywlx = request.getParameter("ywlx");
		/* String fileSize = request.getParameter("fileSize"); */
		File file = null;
		if ("dzzz".equals(ywlx)) {
//			D:/wwdzzz/sy_gtj   /   2023/6/9/CA50808B97900001CBFC12D84B54AC00/苏(2016)射阳县不动产权第0003129号.pdf
			file = new File(dzzzDownloadPath + File.separator + subPath);
		} else {
			file = new File(docStorePath + (subPath != null ? subPath : "") + File.separator + ownerID + File.separator + storeFileName);
		}
		if(!file.exists()){
			System.out.println(subPath + "--------文件不存在----------");
		}
		
		FileInputStream fis = new FileInputStream(file);
		response.setHeader("Cache-Control", "pre-check=0, post-check=0, max-age=0");

		String fileNameKey = "filename";

		if ("download".equals(operateType)) { // 以附件方式下载
			response.addHeader("Content-Disposition", "attachment; " + fileNameKey + "=\"" + realFileName + "\"");
		} else { // 以在线方式浏览
			response.addHeader("Content-Disposition", "inline; " + fileNameKey + "=\"" + realFileName + "\"");
		}

		OutputStream os = response.getOutputStream();
		byte[] buffer = new byte[BUFFER_SIZE];
		try {
			int read;
			while ((read = fis.read(buffer)) != -1) {
				os.write(buffer, 0, read);
			}
		} finally {
			fis.close();
		}
	}

其他

关键点在于文件流的读写,即输入流输出流;

IO流分两种;字符流&字节流

1、什么是流
流是个抽象的概念,是对输入输出设备的抽象,输入流可以看作一个输入通道,输出流可以看作一个输出通道。
输入流是相对程序而言的,外部传入数据给程序需要借助输入流。
输出流是相对程序而言的,程序把数据传输到外部需要借助输出流。
2、字节流与字符流
字节流是由字节组成的,字符流是由字符组成的
网络传输的都是二级制数据,字符流又不是二级制,那么不论对方是怎么处理的文件,他最终传给我的一定是字节流
在这里插入图片描述
直接使用字节流保存

// 获取一个浏览器
DefaultHttpClient httpclient = new DefaultHttpClient();
// 获取get请求
HttpGet httpget = new HttpGet(url);
// 请求对方服务器
HttpResponse response = httpclient.execute(httpget);
// 获取返回数据
InputStream inputStream = response.getEntity().getContent();

// new 一个本地文件
            File file = new File("D:\\11111.pdf");
            // 创建相对于程序的输出流
            OutputStream outputStream = null;
            try {
                outputStream = new FileOutputStream(file);
                // 读取数据
                byte[] b = new byte[1024];// b - 数据
                int off = 0;// off - 数据中的起始偏移量。
                int len = -1;// len - 要写入的字节数。
                while ((len = inputStream.read(b)) != -1) {// 从输入流读取一些字节数,并将它们存储到缓冲区b。实际读取的字节数作为整数返回,如果没有字节可用,因为流在文件末尾,则返回值-1;否则,读取至少一个字节并存储到b。
                    outputStream.write(b, off, len);// 数组b中的一些字节按顺序写入输出流; 元素off是写入的第一个字节,len是此操作写入的最后一个字节。
                }
                outputStream.flush();// 刷新此输出流并强制任何缓冲的输出字节被写出。
            } catch (IOException e) {
                System.out.println("异常");
                e.printStackTrace();
            } finally {
                inputStream.close();//关闭此输入流并释放与此流相关联的任何系统资源。
                outputStream.close();//关闭此输出流并释放与此流相关联的任何系统资源。
            }

使用字符流或者其他子类详情参考:
链接: 接口返回流并保存本地
java IO选择流的原则及其与IO流相关类的关系
JAVA基础知识之BufferedReader流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/641424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

建设现代化智慧十防档案室所需要的技术性方案

一、库房温湿度对档案的影响 库房的温湿度,过高过低都会影响档案制成材料的耐久性。高温高湿会加速纸张的老化水解,使危害档案制成材料的霉菌、细菌繁殖,并增强光化作用,使有害气体、灰尘吸附能力增大。但低温低湿会使纸张变脆&a…

VXLAN 主机VTEP(EVPN)

EVE环境模拟搭建一个基于主机VTEP的VXLAN数据中心网络。 实验里vtep是在linux主机上,同时linux主机还得有路由功能使VTEP的端点IP可达,所以两台linux服务器需要安装FRR。 数据转发平面使用VXLAN封装;在控制平面我打算选择使用EVPN和OVN两种不…

数据中台的商机

阿里拆中台了,很多人来问数据中台还要不要的问题,我认为中台总是要有的,无非是薄厚的问题。然后又有人来问数据中台价值创造的问题,这个其实是数据中台最核心的问题,我就来正式聊一聊,里面有很多的批判&…

T900:可以完美替代P900的国产900MHz无线跳频模块

目录 国产T900模块及其系列成品 T900模块 T900成品 国产T900模块及其系列成品 T900模块及其系列成品,是专门针对无人机及机器人行业设计的,尺寸小、性能优越,可以完美替代microhard的P900产品。下面向大家介绍下T900的相关情况&#xff1…

Dubbo负载均衡策略之 一致性哈希 | 京东云技术团队

本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用。通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的问题和解决方案。 一、负载均衡 …

STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

深入学习 Linux 操作系统的存储 IO 堆栈

一、Linux 存储堆栈图 当使用 read() 和 write() 系统调用向内核提交读写 I/O 请求操作时需要经历的步骤: 1)首先,请求经过虚拟文件系统,虚拟文件系统提供了统一的文件和文件系统的相关接口,屏蔽了不同文件系统的差异…

Applied soft computing期刊投稿流程

爱斯唯尔账户注册问题: 账号所属作者即默认通讯作者 刚开始应该会进入这个页面,这里的用户名和密码一般是导师(通讯作者)的账号密码,可以询问老师,然后点击author login登陆就好。 注册里面强调一点,这里面的Title 一般是职称的意思,如果是学生可以填Mr.或者Mrs. 投…

Python 网络舆情分析系统,舆论可视化界面

1 简介 舆情管理系统,这不仅仅可以帮助当地的管理人员迅速的排查跟本地有关的负面言论,还可以避免网民因为本身意识不到位而评论或发布一些不好的观点的情况,最终的目的就是帮助社会更好的发展。 2 技术栈 说明技术栈备注后台Python前端HT…

多线程:Lamda表达式

Lamda表达式 希腊字母表中第十一个字母,英文名字为lambda避免匿名内部类定义过多其实质是函数类编程的概念new Thread (() -->System.out.println(“多线程的学习…”)).start();为什么要使用Lamda表达式? 1、避免匿名内部类定义过多 2、可以让你的代…

Vue中如何进行移动端适配与响应式布局?

Vue中如何进行移动端适配与响应式布局? 如今,移动端适配与响应式布局已经成为Web开发中不可或缺的一部分。Vue.js作为一款流行的JavaScript框架,也提供了许多有用的工具和技术来实现移动端适配和响应式布局。在这篇文章中,我们将…

阿里云服务器ESSD PL-0云盘与ESSD PL-1云盘区别及选择参考

在我们选购阿里云服务器的时候,通常系统盘与数据盘类型都是ESSD云盘,而云盘的性能又分为PL-0和PL-1,虽然都属于ESSD云盘,但是它们之间的性能是有区别的,收费标准也不一样,本文为大家介绍一下阿里云服务器ES…

26岁,大学肄业,家里蹲5年,这位失业青年的求救,牵动百万网友的心……

近期,知乎上有一个求救贴火了,浏览量一度飙升到480多万,近千名网友在帖子下留言,纷纷表达自己的看法。 帖子是这样的。题主26岁,大学肄业。最长只上过12天的班,每次出门面试找工作就会非常害怕&#xff0c…

win11 idea shift+F6快捷键失效问题

1.结论 win11微软输入发最新版问题,使用以前版本即可 2.排查问题过程 最近一直没用shiftF6,当今天要使用时候,突然发现失效了,开始了以下排查过程 2.1 软件快捷键冲突 刚开始以为和其他软件或diea内部快捷键冲突,做了…

计算机组成原理 | 深入理解ELF格式和静态链接

深入解析C语言代码到机器码的过程 #mermaid-svg-UhCa4aLgwtwtM4hS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UhCa4aLgwtwtM4hS .error-icon{fill:#552222;}#mermaid-svg-UhCa4aLgwtwtM4hS .error-text{fill:#5…

whatsapp如何开发国外客户

WhatsApp可以说是目前2023年最火的社交营销方式之一,目前全球活跃人数大概在10亿,每日发送消息超过650亿条,语音和通话的时长超过20亿分钟,全球三分之一的人在用WhatsApp的,所有做外贸,WhatsApp是必不可少的…

ESXi 7.0 U3m Fujitsu (富士通) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

AIGC + RTE,一个实时互动的应用实践

一夜之间,区块链、元宇宙、Web3、VR等风口似乎都消散了,似乎只有 AI 才是C位。声网 RTC 云市场各类插件 AIGC,会迸发出什么样的火花呢? 最近,声网内部组织了一次黑客松,经过激烈的角逐,我们团…

【华为OD机试真题2023B卷 JAVAJS】完全二叉树非叶子部分后序遍历

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 完全二叉树非叶子部分后序遍历 知识点数组树递归 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一个以顺序储存结构存储整数值的完全二叉树序列(最多1000个整数),请找出此完全二叉树的所有非叶子节点部分,…

成功邀请媒体采访的关键步骤,媒介易助你成为媒体热门

在企业品牌推广和宣传中,与媒体建立合作关系,并邀请媒体进行采访是非常重要的环节。通过媒体的报道和宣传,企业可以扩大品牌的曝光度,提升品牌形象和知名度。然而,成功的媒体邀约并非易事,需要一定的策略和…