使用nio代替传统流实现文件上传和下载功能

1.文件下载

/**NIO文件下载工具类* @author olalu*/
public class NioDownloadUtils {/*** @description:* @param file: 要下在文件* @return: void*/public static void downloadDoc(File file,HttpServletResponse response) throws IOException {OutputStream outputStream = response.getOutputStream();String contentType = Files.probeContentType(Paths.get(file.getAbsolutePath()));//设置响应头response.setHeader("Content-Type", contentType);response.setHeader("Content-Disposition", "attachment;filename="+ new String(file.getName().getBytes("utf-8"),"ISO8859-1"));response.setContentLength((int) file.length());//获取文件输入流FileInputStream fileInputStream = new FileInputStream(file);//获取输出流通道WritableByteChannel writableByteChannel = Channels.newChannel(outputStream);FileChannel fileChannel = fileInputStream.getChannel();//采用零拷贝的方式实现文件的下载fileChannel.transferTo(0,fileChannel.size(),writableByteChannel);//关闭对应的资源fileChannel.close();outputStream.flush();writableByteChannel.close();}public static void downloadDoc(String path,HttpServletResponse response) throws IOException {File file = new File(path);if (!file.exists()){throw new RuntimeException("文件不存在");}downloadDoc(file,response);}}

2.文件上传

/*** 文件上传方法*/public static Result uploading(MultipartFile file) {//获取文件名String realName = file.getOriginalFilename();String newName = null;if(realName != null && realName != ""){//获取文件后缀String suffixName = realName.substring(realName.lastIndexOf("."));//生成新名字newName = UUID.randomUUID().toString().replaceAll("-", "")+suffixName;}else {return Result.fail("文件名不可为空");}//创建流FileInputStream fis = null;FileOutputStream fos = null;//创建通道FileChannel inChannel = null;FileChannel outChannel = null;try {fis = (FileInputStream)file.getInputStream();//开始上传fos = new FileOutputStream(UPLOAD_URL+"\\"+newName);//通道间传输inChannel = fis.getChannel();outChannel = fos.getChannel();//上传inChannel.transferTo(0,inChannel.size(),outChannel);}catch (IOException e){return Result.fail("文件上传路径错误");}finally {//关闭资源try {if (fis != null) {fis.close();}if (fos != null) {fos.close();}if (inChannel != null) {inChannel.close();}if (outChannel != null) {outChannel.close();}} catch (IOException e) {e.printStackTrace();}}return Result.ok(newName);}

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

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

相关文章

武汉地铁19号线完成5G专网全覆盖,现场测试下行速率超千兆!

近日,极目新闻记者从中国移动湖北公司获悉,随着武汉地铁19号线全线隧道正式贯通,湖北移动目前已完成新月溪公园至鼓架山站5G网络覆盖,轨行区5G专网全覆盖,并成功进行试车验证,19号线成为国内首条全线实现5G…

实习笔记(一)

自定义注解: 自定义注解中有三个元注解Target,Retention,Document /*** 系统日志注解** author Mark sunlightcsgmail.com*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface SysLog {String value() default "…

2023全国大学生数学建模竞赛C题思路模型代码

目录 1.C题思路模型:比赛开始后,第一时间更新,获取见文末名片 2.比赛时间:2023年9月7日18点到2023年9月10日20点 3 全国大学生数学建模竞赛常见数模问题 3.1 分类问题 3.2 优化问题 详细思路见此名片,开赛第一时间…

面试题解析 | 为什么Redis使用单线程性能会优于多线程?

大家好,我是小米!今天我要和大家聊一个有关Redis的热门面试题:为什么Redis使用单线程性能会优于多线程?相信这个问题在很多同学心中都曾经纠结过,那么接下来,就让我们一起来揭开这个技术之谜吧!…

LeetCode 37题:解数独

题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独…

IDEA简单拷贝一份新项目记录

IDEA简单拷贝项目记录 拷贝后改项目名,然后iml 配置文件改项目名,然后 .idea 中的compiler.xml 里面的name标签改项目名。 就可以了

【软件工程】软件测试

软件测试的对象 软件程序文档 测试对象:各个阶段产生的源程序和文档。 软件测试的目的 基于不同的立场,对软件测试的目的存在着两种完全对立的观点。 (1)一种观点是通过测试暴露出软件中所包含的故障和缺陷(从用户的角度)&#xf…

ssh-keygen 做好免密登录后不生效

免密说明 通常情况下,我们ssh到其他服务器需要知道服务器的用户名和密码。对于需要经常登录的服务器每次都输入密码比较麻烦,因此我们可以在两台服务器上做免密登录,即在A服务器可以免密登录B服务器。 在A服务器上登录B服务器时,…

Tik Tok娱乐+电商MCN怎么做?

在美国外的热门市场中,TikTok 主要做的区域市场包括中东、拉美、欧洲和东亚,而这里面适合做电商的其实并不多。 欧洲、东亚都属于成熟市场,且 TikTok 本身在欧洲面临 DSA 法案更严格的审查,与在英国相同,欧洲各市场消…

第G1周:生成对抗网络(GAN)入门

🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 一、理论基础 生成对抗网络(Generative Adversarial Networks, GAN)是近年来深度学习领域…

Windows安装Go开发环境

Windows安装Go开发环境 一、Go语言下载地址 https://golang.google.cn/dl/ 二、设置工作空间GOPATH目录(Go语言开发的项目路径) 首先进入我的C盘(你放到其他盘也行),新建一个文件夹,名字叫做mygo(这个就是你的工作目…

ArcGIS Maps SDK for JavaScript系列之一:在Vue3中加载ArcGIS地图

目录 ArcGIS Maps SDK for JavaScript简介ArcGIS Maps SDK for JavaScript 4.x 的主要特点和功能AMD modules 和 ES modules两种方式比较Vue3中使用ArcGIS Maps SDK for JavaScript的步骤创建 Vue 3 项目安装 ArcGIS Maps SDK for JavaScript创建地图组件 ArcGIS Maps SDK for …

“深入理解JVM:探索Java虚拟机的内部工作原理“

标题:深入理解JVM:探索Java虚拟机的内部工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部工作原理,包括JVM的架构、类加载、内存管理、垃圾回收机制等方面。通过理解JVM的内部工作原理,我们…

华为开源自研AI框架昇思MindSpore应用案例:基于MindSpore框架的UNet-2D案例实现

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年,随着基于自注意&…

改造旧项目-长安分局人事费用管理系统

一、系统环境搭建 1、搭建前台环境 vue3vite构建项目复制“银税系统”页面结构,包括:路由、vuex存储、菜单、登录(复制一个干净的空架子) 2、搭建后台环境 新三大框架 SSMP聚合工程:common、admin,新的…

JAVA冒泡排序

package com.hzh.javase.day03;public class maopao {public static void main(String[] args) {int[] arr {2, 11,4,7,5,22,15,37,12,1};int zjvalue 0;//中间值boolean boofalse; //冒泡比较相邻元素将小的提前打的放后 // 外层循环时用来控制轮数 // 内存循…

2023国赛数学建模E题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

Linux服务器上配置HTTP和HTTPS代理

本文将向你分享如何在Linux服务器上配置HTTP和HTTPS代理的方法,解决可能遇到的问题,让你的爬虫项目顺利运行,畅爬互联网! 配置HTTP代理的步骤 1. 了解HTTP代理的类型:常见的有正向代理和反向代理两种类型。根据实际需求…

涉及近300个业务场景,重庆银行数字员工平台建设解析

随着数字化转型战略规划的逐步落地,重庆银行于2022年6月成功建设了数字员工平台,该平台已成为行内数字化转型的标杆应用。数字员工平台以RPA(机器人流程自动化)为基础,AI(人工智能)技术为抓手&a…

PHP最简单自定义自己的框架view使用引入smarty(8)--自定义的框架完成

1、实现效果。引入smarty, 实现assign和 display 2、下载smarty,创建缓存目录cache和扩展extend 点击下面查看具体下载使用,下载改名后放到extend PHP之Smarty使用以及框架display和assign原理_PHP隔壁老王邻居的博客-CSDN博客 3、当前控…