当前位置: 首页 > news >正文

凡客做网站怎么样中国建设银行网站个人客户

凡客做网站怎么样,中国建设银行网站个人客户,深圳洲聚网站建设,哪家手机网站建设今天受到一个需求#xff0c;需要查出文件#xff0c;然后将文件打包后下载。看了下项目里默认代码有压缩功能#xff0c;以此修改了下#xff0c;项目使用了hutool。项目是若依项目 定义zip的数据传输对象#xff0c;ossId可以是文件表的id Data public class SysOssZi…今天受到一个需求需要查出文件然后将文件打包后下载。看了下项目里默认代码有压缩功能以此修改了下项目使用了hutool。项目是若依项目 定义zip的数据传输对象ossId可以是文件表的id Data public class SysOssZipDTO {/*** 关联OSS对象存储ID*/ })private String ossId;/*** 压缩包文件内文件夹路径例子main/java/com/haoyu/flowForm/domain/*/private String zipItemFolderPath;}sevice层 void downloadZip(ListSysOssZipDTO zipDtoList, HttpServletResponse response, String taskId) throws IOException; serviceImpl层 Overridepublic void downloadZip(ListSysOssZipDTO zipDtoList, HttpServletResponse response, String taskId) throws IOException {if(zipDtoList null || zipDtoList.isEmpty()){return;}ZipOutputStream zip new ZipOutputStream(response.getOutputStream());final int bufferSize 1024 * 1024 * 5; // 5MBfinal byte[] buffer new byte[bufferSize];long totalFileSize 0; // 文件总大小估计值// 任务进度keyfinal String progressKey OssConstant.SYS_OSS_PROGRESStaskId;for (int i 0;izipDtoList.size();i){// 设置进度可选用于压缩进度查询就是将进度存入redis里然后设计个接口供前端查询进度/*SysOssProgressBO sysOssProgressBO new SysOssProgressBO();sysOssProgressBO.setProgressNumber(Long.valueOf(i));sysOssProgressBO.setTotalProgress(Long.valueOf(zipDtoList.size()));RedisUtils.setCacheObject(progressKey,sysOssProgressBO, Duration.ofMinutes(10));*/SysOssZipDTO zipDTO zipDtoList.get(i);if(StrUtil.isEmpty(zipDTO.getOssId())|| StrUtil.isEmpty(zipDTO.getZipItemFolderPath())){continue;}// 通过id查找文件信息SysOssVo sysOss matchingUrl(SpringUtils.getAopProxy(this).getById(zipDTO.getOssId()));if (ObjectUtil.isNull(sysOss)) {continue;}// 通过文件信息获取文件流本文用的Oss存储如果用别的可以自己写核心就是读取流OssClient storage OssFactory.instance(sysOss.getService());try(InputStream inputStream storage.getObjectContent(sysOss.getUrl());){// 这里使用文件名了拼上前缀序号解决文件名重复问题zip.putNextEntry(new ZipEntry(zipDTO.getZipItemFolderPath() (i)sysOss.getOriginalName().replaceAll(/,_ )));int available inputStream.available();totalFileSize available;// 防Oom可以用下面注释的也可以用hutool的/*int len 0;while((len inputStream.read(buffer)) ! -1){zip.write(buffer, 0, len);}*/IoUtil.copy(inputStream, zip, bufferSize);zip.flush();zip.closeEntry();}catch (Exception e) {throw new ServiceException(e.getMessage());}}IoUtil.close(zip);// 生成zip文件// 由于前面已经开启了response的outputstream,所以这里不能调用reset()方法否则会导致流异常关闭 // response.reset();response.addHeader(Access-Control-Allow-Origin, *);response.addHeader(Access-Control-Expose-Headers, Content-Disposition);response.addHeader(Content-Length, totalFileSize);response.setContentType(application/octet-stream; charsetUTF-8);// 下载后的文件名可以由前端控制此处由前端控制所以注释掉了/*if(StrUtil.isNotEmpty(zipName)){FileUtils.setAttachmentResponseHeader(response, zipName .zip);}*/}其中的文件查询进度是可选的可以让前端生成个任务id传到服务器 controller层 GetMapping(/downloadZipByTrainId/{trainId})public void downloadZipByTrainId(HttpServletResponse response, PathVariable String trainId) throws IOException {// downloadZipByTrainId()方法里面调用downloadZip()this.iTrainMaterialsService.downloadZipByTrainId(trainId,response);}前端代码此处使用的是vue3 // 需要npm安装file-saver import { saveAs } from file-saver// 点击按钮触发事件 const clickDownLoadMaterials async (row) {if(row.materialCount 0 ){let res await zip(/train/trainMaterials/downloadZipByTrainId/${row.id}?projectName${row.trainName},${row.trainName})}else{ElMessage({message: 暂无材料可下载!,type: warning,})} }const zip (url, name) {isShowLoadingDownLoadMaterial.value trueurl baseURL urlaxios({method: get,url: url,responseType: blob,headers: {// 请求头tokenAuthorization: Bearer getToken()}}).then(async (res) {if(res.status 200){isShowLoadingDownLoadMaterial.value false}const isLogin await blobValidate(res.data);if (isLogin) {const blob new Blob([res.data], { type: application/zip })saveAss(blob, name)} else {await this.printErrMsg(res.data);}}) }const saveAss (text, name, opts) {saveAs(text, name, opts); }// 验证是否为blob格式 export async function blobValidate(data) {try {const text await data.text();JSON.parse(text);return false;} catch (error) {return true;} }杂谈 这次的需求整理到了不少东西一开始担心oom的问题于是调试时改变了缓冲区大小发现java使用的内存也会对应的发生变化这是为什么呢实际上原因很简单final byte[] buffer new byte[bufferSize];这个变量就是占用这么多字节的内存呀 当缓冲区设成0的时候会发现读的特别特别慢这是为什么呢这是由于读的大小太小了java调取磁盘io的频率变多而调取磁盘io是一个特别消耗资源的行为也特别慢因此就慢了。设置合适的缓冲区大小可以一次性读取对应大小的内容从而减少磁盘io的交互从而提升效率但也要避免缓冲区过大导致变量占用内存过大而oom。 同时java流的操作不是一次性将整个文件都读入内存中的而是仅仅获取文件的句柄同时读偏移量不停的读移动偏移量直至文件读写结束大佬原话。而且系统加载文件到内存也是按块加载的并不会一次性全读到内存中如一个几十g的游戏打开并不会占用几十g内存而是用到的时候在加载不足的时候就会根据算法按页或者按块替换 最后开了流一定要关流response.getOutputStream()自带的流可以不用手动关servlet在请求结束的时候会自己关掉
http://www.hkea.cn/news/14505763/

相关文章:

  • 国家电网 两学一做 网站企业网站建设广州
  • 做设计用的常用网站wordpress 文件夹名称
  • 网站建设伍际网络搭建电商平台
  • 怎么做网站的广告做购物网站表结构分析
  • 辽宁建设工程信息网新网站网站页面链接怎么做的
  • 网站内容优化的主要方法html5新特性
  • 班级博客网站模板石家庄网络营销
  • 中国建设银行总部网站一直免费的服务器下载安装
  • 个人网站推广广告北京网站建设签约
  • 阀门公司网站建设如何更改公司网站内容
  • 南宁网站怎么做seo企业网站改自适应
  • 做设计有哪些免费网站项目管理过程五个阶段
  • 图片滤镜网站开发网站建设及维护
  • 十大农业网站企业网站架构
  • 网站首页策划小榄网站设计
  • 浙江专业网站建设商城报价昆明室内设计学校
  • 四川建设发展股份有限公司网站网站运营分析
  • 网站返回500错误网站怎么留住用户
  • 软件企业网站模板高端网站开发哪家强
  • 怎样弄网站的导航栏wordpress主题百度网盘
  • 接视频做的网网站靖江网站定制
  • 北京品牌网站定制公司建设网站意义
  • 个人音乐网站源码单页面网站怎么优化
  • 做音乐网站之前的准备企业网站建设与实施调查报告
  • 做网站的服务器还需要空间吗巴音郭楞网络营销
  • 网站建设运行问题及建议Wordpress好看模板
  • wordpress设置样式哈尔滨seo优化运营
  • 做编辑器的网站酒店网站建设方案结束语
  • 沂源网站制作厦门设计公司有哪些
  • 常州网站推广排名北京代理记账公司招聘