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

中小学建设网站网页设计编辑器

中小学建设网站,网页设计编辑器,网站 体系,公司网站怎么做产品图片应用场景 分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。 分片上传的场景…

应用场景

分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(我们称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

分片上传的场景

  • 大文件上传

  • 网络环境环境不好,存在需要重传风险的场景

分片上传的步骤

没有
前端上传文件的MD5值
判断是否上传过文件
创建文件存储用于存储分块
前端上传文件的MD5值和分块文件的序号
通过序号判断是否包含该分块
前端上传分块
存储分块
是否是最后一块
合并分块
返回文件的存储路径

检查文件的代码

在文件第一次上传时,上传文件的md5值,从而判断文件是否存在minio中

public Result<Boolean> checkFile(String fileMd5) {//正常做业务时应该先从数据库中查询//如果数据库存在再查询 minioGetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(bucketName)//                    todo 这里固定了文件的后缀,实际情况下应该从数据库开始查询,得到文件的路径.object(getFilePathByMd5(fileMd5,"png")).build();//查询远程服务获取到一个流对象try {FilterInputStream inputStream = minioClient.getObject(getObjectArgs);if(inputStream!=null){//文件已存在return Result.success(true);}} catch (Exception e) {e.printStackTrace();}//文件不存在return Result.success(false);}

检查分块的代码

检查分块是前端把需要上传的文件经过大小计算后,算出分块的数量,然后把循环发送文件的md5值和分块序号,然后在minio中检查对应文件夹下是否有对应的分块,如果检查到某一处没有对应的分块,便知道传输中断的位置。

 public Result<Boolean> checkChunk(String fileMd5, int chunkIndex) {//根据md5得到分块文件所在目录的路径String chunkFileFolderPath = getChunkFileFolderPath(fileMd5);//如果数据库存在再查询 minioGetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(bucketName).object(chunkFileFolderPath+chunkIndex).build();//查询远程服务获取到一个流对象try {FilterInputStream inputStream = minioClient.getObject(getObjectArgs);if(inputStream!=null){//文件已存在return Result.success(true);}} catch (Exception e) {e.printStackTrace();}//文件不存在return Result.success(false);}

上传分块的代码

    public Result uploadChunk(String fileMd5, int chunk, String localChunkFilePath) {//分块文件的路径String chunkFilePath = getChunkFileFolderPath(fileMd5) + chunk;//获取mimeTypeString mimeType = localChunkFilePath.substring(localChunkFilePath.lastIndexOf("."));//将分块文件上传到minioboolean b = addMediaFilesToMinIO(localChunkFilePath, mimeType, bucketName, chunkFilePath);if(!b){return Result.error("上传分块文件失败");}//上传成功return Result.success(true);}

合并分块的代码

合并分块文件之前,需要检查文件是否和源文件相同,我们通过把分块合并后取文件的md5值和传输过来的MD5值作比较,如果相同则证明传输正确,把合并后的文件存入minio中,并清除分块文件

public Result mergechunks(String fileMd5, int chunkTotal) {//分块文件所在目录String chunkFileFolderPath = getChunkFileFolderPath(fileMd5);//找到所有的分块文件List<ComposeSource> sources = Stream.iterate(0, i -> ++i).limit(chunkTotal).map(i -> ComposeSource.builder().bucket(bucketName).object(chunkFileFolderPath + i).build()).collect(Collectors.toList());//合并后文件的objectnameString objectName = getFilePathByMd5(fileMd5, "png");//指定合并后的objectName等信息ComposeObjectArgs composeObjectArgs = ComposeObjectArgs.builder().bucket(bucketName).object(objectName)//合并后的文件的objectname.sources(sources)//指定源文件.build();//===========合并文件============//报错size 1048576 must be greater than 5242880,minio默认的分块文件大小为5Mtry {minioClient.composeObject(composeObjectArgs);} catch (Exception e) {e.printStackTrace();log.error("合并文件出错,bucket:{},objectName:{},错误信息:{}",bucketName,objectName,e.getMessage());return Result.error("合并文件异常");}//===========校验合并后的和源文件是否一致,视频上传才成功===========//先下载合并后的文件File file = downloadFileFromMinIO(bucketName, objectName);try(FileInputStream fileInputStream = new FileInputStream(file)){//计算合并后文件的md5String mergeFile_md5 = DigestUtils.md5Hex(fileInputStream);//比较原始md5和合并后文件的md5if(!fileMd5.equals(mergeFile_md5)){log.error("校验合并文件md5值不一致,原始文件:{},合并文件:{}",fileMd5,mergeFile_md5);return Result.error("文件校验失败");}}catch (Exception e) {return Result.error("文件校验失败");}//==============将文件信息入库============
//        在做业务时要将得到的路径存入数据库//==========清理分块文件=========clearChunkFiles(chunkFileFolderPath,chunkTotal);return Result.success(true);}/*** 清除分块文件* @param chunkFileFolderPath 分块文件路径* @param chunkTotal 分块文件总数*/private void clearChunkFiles(String chunkFileFolderPath,int chunkTotal){Iterable<DeleteObject> objects =  Stream.iterate(0, i -> ++i).limit(chunkTotal).map(i -> new DeleteObject(chunkFileFolderPath+ i)).collect(Collectors.toList());;RemoveObjectsArgs removeObjectsArgs = RemoveObjectsArgs.builder().bucket(bucketName).objects(objects).build();Iterable<io.minio.Result<DeleteError>> results = minioClient.removeObjects(removeObjectsArgs);//要想真正删除results.forEach(f->{try {DeleteError deleteError = f.get();} catch (Exception e) {e.printStackTrace();}});}
http://www.yayakq.cn/news/287740/

相关文章:

  • 为什么要建设个人网站做网站需要域名跟服务器吗
  • 自己做一个网站需要多少钱text-indent:2em wordpress
  • 昌邑建设网站无锡网站建设方案托管
  • 广州市企业网站建设怎么样推广软文是什么
  • 嘉兴网站制作套餐wordpress多语言包
  • 丰城网站建设公司2345电视剧网站免费
  • tomcat做的网站打不开了网站建设课程设计实训心得
  • 签订网站建设合同应注意邯郸网站设计应搜韦欣cidun8上词
  • 如皋网站开发qq小程序游戏入口
  • 网站建设及维护流程图杭州seo外包优化
  • 织梦网站漏洞在线制作印章免费
  • 东莞做企业网站网站推广计划方案
  • 深圳网站建设联系电话做网站膜网站怎么做
  • 询广西南宁网站运营wordpress评论跳过验证
  • 为什么苏州网络进不了网站城市人家装饰公司怎么样
  • 网站建设错误代码50019朝阳区手机网站建设服务
  • 可信网站认证好处网站建设毕业设计心得
  • 建设网站技术人员先进事迹php企业网站开发好学么
  • 网站开发插件word素材库免费
  • 广西智能网站建设企业临汾网站建设销售
  • 域名跳转网站网站质作
  • 做ppt兼职网站有哪些化妆品成品网站
  • 建企业网站 硬件社区微网站建设方案ppt模板
  • mysql数据库网站北京环球影城可以带水果吗
  • 哪个网站做美食视频软件基于WordPress免费博客
  • 重庆网站怎么设置游戏网站的设计方案
  • 淘宝网站可以做轮播吗做网站如何报价
  • 怎样在百度上做网站e网科技网站
  • 济南建设信息网站公司网站首页模板
  • 企业网站建设信息管理平台joomla网站如何加入会话功能