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

只做画册的网站网站制作作业

只做画册的网站,网站制作作业,医疗网站设计,服装网站设计方案学习链接 SpringBootvue文件上传&下载&预览&大文件分片上传&文件上传进度 Blob & File & FileReader & ArrayBuffer VueSpringBoot实现文件的分片下载 video标签学习 & xgplayer视频播放器分段播放mp4(Range请求交互过程可以参…

学习链接

SpringBoot+vue文件上传&下载&预览&大文件分片上传&文件上传进度

Blob & File & FileReader & ArrayBuffer

Vue+SpringBoot实现文件的分片下载

video标签学习 & xgplayer视频播放器分段播放mp4(Range请求交互过程可以参考这个里面的截图)

【java】java实现大文件的分片上传与下载(springboot+vue3)(代码已fork至本地)

代码

FileController

这里面的代码实现,完全可以参考ResourceHttpRequestHandler#handleRequest

@RestController
public class FileController {private static final int BUFFER_SIZE = 4 * 1024;@RequestMapping(path = "chunkdownload", method = {RequestMethod.HEAD, RequestMethod.POST})public void chunkdownload(HttpServletRequest request, HttpServletResponse response) throws Exception {File file = new File("D:/usr/test/demo.mp4");// 文件总大小long fileSize = file.length();// 设置 Content-Type 和 相关响应头// (这里分片下载响应头设置, 其实可以参考ResourceHttpRequestHandler#handleRequest,//  和 video标签学习 & xgplayer视频播放器分段播放mp4 - https://blog.csdn.net/qq_16992475/article/details/130945997)response.setContentType("application/octect-stream;charset=UTF-8");response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");response.setHeader("Accept-Ranges", "bytes");// 检查请求头中是否有Range请求头,// (可参考:video标签学习 & xgplayer视频播放器分段播放mp4 - https://blog.csdn.net/qq_16992475/article/details/130945997)String rangeHeader = request.getHeader("Range");// 没有Range请求头, 则下载整个文件if (rangeHeader == null) {response.setHeader("Content-Length", String.valueOf(fileSize));InputStream in = new FileInputStream(file);OutputStream out = response.getOutputStream();// 字节缓冲数组byte[] buffer = new byte[BUFFER_SIZE];int bytesRead = -1;// 读取多少, 写多少, 直到读取完毕为止while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}in.close();out.close();} else {// 分片下载// (可参考: 参考ResourceHttpRequestHandler#handleRequest中的做法)// 开始索引long start = 0;// 结束索引long end = fileSize - 1;// 获取Range请求头的范围, 格式为:Range: bytes=0-8055,// (其中可能没有结束位置, 若没有位置, 取文件大小-1)String[] range = rangeHeader.split("=")[1].split("-");// 如果Range请求头中没有结束位置, 取文件大小-1if (range.length == 1) {start = Long.parseLong(range[0]);end = fileSize - 1;} else {// 解析开始位置 和 结束位置start = Long.parseLong(range[0]);end = Long.parseLong(range[1]);}// 此次要写出的数据long contentLength = end - start + 1;// 返回头里存放每次读取的开始和结束字节response.setHeader("Content-Length", String.valueOf(contentLength));// 响应状态码206response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);// Content-Range响应头格式为:Content-Range: bytes 0-8055/9000response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileSize);InputStream in = new FileInputStream(file);OutputStream out = response.getOutputStream();// 跳到第start字节in.skip(start);// 字节缓冲数组byte[] buffer = new byte[BUFFER_SIZE];// 读取的字节数量int bytesRead = -1;// 写出的字节数量long bytesWritten = 0;while ((bytesRead = in.read(buffer)) != -1) {// 如果 已写入的数据 + 当前已读到的数据 超过了 此次要写出的数据, 则只能写入请求范围内的数据if (bytesWritten + bytesRead > contentLength) {out.write(buffer, 0, (int) (contentLength - bytesWritten));break;} else {out.write(buffer, 0, bytesRead);bytesWritten += bytesRead;}}in.close();out.close();}}}

ChunkDownload.vue

  • 先发1个head请求,获取到文件的大小
  • 再发post请求,获取每个分片(其中为了简单理解,就不引入async-await的使用了)
  • 将获取的每个分片组合为单个文件
<template><div class="gap"><el-button @click="downloadChunks">分片下载demo.mp4</el-button></div>
</template><script>
import axios from 'axios'export default {name: 'ChunkDownload',components: {},methods: {downloadChunks() {const chunkdownloadUrl = 'http://localhost:8085/chunkdownload'// 分片下载大小 5MBconst chunkSize = 1024 * 1024 * 5;// 文件总大小(需要请求后端获得)let fileSize = 0;axios.head(chunkdownloadUrl).then(res => {// 定义 存储所有的分片的数组let chunks = [];// 获取文件总大小fileSize = res.headers['content-length']// 计算分片数量const chunksNum = Math.ceil(fileSize / chunkSize)// 定义下载文件分片的方法function downloadChunkFile(chunkIdx) {if (chunkIdx >= chunksNum) {alert('分片索引不可超过分片数量')return}let start = chunkIdx * chunkSizelet end = Math.min(start + chunkSize - 1, fileSize - 1)const range = `bytes=${start}-${end}`;axios({url: chunkdownloadUrl,method: 'post',headers: {Range: range},responseType: 'arraybuffer'}).then(response => {chunks.push(response.data)if(chunkIdx == chunksNum - 1) {// 下载好了console.log(chunks, 'chunks');// 组合chunks到单个文件const blob = new Blob(chunks);console.log(blob, 'blob');const link = document.createElement('a');link.href = window.URL.createObjectURL(blob);link.download = 'demo.mp4';link.click();return} else {++chunkIdxdownloadChunkFile(chunkIdx)}})}downloadChunkFile(0)})}}
}
</script><style>
.gap {padding: 10px;
}
</style>

测试

在这里插入图片描述

http://www.yayakq.cn/news/895150/

相关文章:

  • 北京专业网站设计制作竟标网站源码
  • asp.net 价格查询网站郑州网站推广电话
  • 怎么选择一个好的友情链接网站展示型网站建设服务
  • 农家乐网站开发项目背景wordpress破解主题分享下载
  • 网站的外部链接建设wordpress头部导航栏代码
  • 中国第八冶金建设公司网站徐州市贾汪区建设局网站
  • 网站都需要什么类别南宁vi设计公司
  • 本站3天更换一次域名yw纯代码添加wordpress网站底部导航
  • 网站和公众号的区别是什么意思微信公众号怎么创建桌面快捷方式
  • 青岛网站建中堂做网站
  • 网站美工培训课程门户网站的建设要求
  • 咋样看网站域名是哪个服务商的手机好用的wordpress
  • 网站备案 前置审批号建设网站找网络公司
  • 丰宁县有做网站的吗?睡不着来个网址2022
  • 俄语网站里做外贸shop深圳网站建设联系方式
  • 网网站建设站建设仿一个网站要多少钱
  • 陕西省交通建设网站株洲做网站的公司
  • 河南汉狮做网站的公司精准营销的核心是什么
  • 电器企业网站建站商标注册查询是否有人注册了怎么查
  • 建设部资质查询网站昆山市有没有做网站设计的
  • 网站建设公司itcask免费网站制作软件有哪些
  • 关于网站建设维护的创业计划书店铺如何运营和推广
  • 做网站用什么编程语言足球网站怎么做
  • 拉企业做网站好干吗化妆品行业网站建设方案
  • 安徽省网站备案快吗软件开发公司介绍
  • 南京企业做网站wordpress 折800模板
  • 电影采集网站怎么做seohtml5高端装修公司网站源码
  • 摄影网站建设解决方案招商加盟网站大全
  • wordpress建中文网站项目推广方式有哪些
  • 浙江信息港证件查询seo搜索引擎优化营销案例