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

上海网站搜索排名优化哪家好石狮网站建设制作

上海网站搜索排名优化哪家好,石狮网站建设制作,设计培训学院,网站解除域名绑定上节我们说了Minio怎么大文件上传#xff0c;我们是进行了分段上传#xff0c;然后合并处理#xff0c;感兴趣的可以去这篇文章#xff0c; Springboot Minio最新版大文件上传-CSDN博客 那么今天的主题就是大文件下载#xff0c;再大文件就需要分段下载#xff0c;也就需…上节我们说了Minio怎么大文件上传我们是进行了分段上传然后合并处理感兴趣的可以去这篇文章 Springboot Minio最新版大文件上传-CSDN博客 那么今天的主题就是大文件下载再大文件就需要分段下载也就需要前端给下载的范围就是下面的range的参数我们为了好测试将此字段放入了参数了实际你可以放入header头部。 下载的Controller类 Slf4j RestController public class DownloadController {Resourceprivate IDownloadProcess downloadProcess;// http://localhost:8082/download?filenamea9500aa2091875f3d02a9b84ae1ab712.mp4rangebytes0-52428800// 分段下载的化支持断点下载暂停下载断网恢复下载等。// 我测试就采取这种方式RequestParam大家真实场景可以放到header里 RequestHeader(name Range, required false) String range,GetMapping(/download)public ResponseEntity downloadFile(RequestParam String filename,RequestParam(required false) String range,HttpServletRequest request, HttpServletResponse response) {try {return downloadProcess.downloadFile(filename, range, request, response);} catch (Exception e) {log.error(下载异常|参数{}{}|{}, filename, range, e);return new ResponseEntitybyte[](HttpStatus.INTERNAL_SERVER_ERROR);}}} IDownloadProcess定义下载接口 public interface IDownloadProcess {ResponseEntity downloadFile(String filename, String range, HttpServletRequest request, HttpServletResponse response) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException, Exception; }DownloadProcessImpl下载实现类 我们可以传range参数来处理要下载的kb数范围当然也可以不传递就是下载全部 1.首先就是获取桶里文件信息文件大小什么的都能获取 2.查看是范围下载还是全部下载 3.设置响应下载的类型和请求头 4.获取minio的流文件 5.将流文件遍历读取放入缓冲中 6.然后写入到OutputStream流中然后刷新就可以啦。 Slf4j Service public class DownloadProcessImpl implements IDownloadProcess {Resourceprivate MinioClient minioClient;Resourceprivate MinioConfig minioConfig;// 完整文件与分片文件下载Overridepublic ResponseEntity downloadFile(String filename, String range, HttpServletRequest request, HttpServletResponse response) throws Exception {ResponseEntitybyte[] responseEntity null;BufferedOutputStream os null;GetObjectResponse stream null;if (StringUtils.isNotBlank(filename)) {log.info(要下载的文件:{}, filename);//String range request.getHeader(Range);log.info(current request rang:{}, range);// 获取桶里文件信息StatObjectResponse statObjectResponse minioClient.statObject(StatObjectArgs.builder().bucket(minioConfig.getBucketName()).object(filename).build());//开始下载位置long startByte 0;//结束下载位置long endByte statObjectResponse.size() - 1;log.info(文件开始位置{}文件结束位置{}文件总长度{}, startByte, endByte, statObjectResponse.size());// 有range的话,需要根据前端下载长度进行下载也就是分段下载// 例如rangebytes0-52428800if (StringUtils.isNotBlank(range) range.contains(bytes) range.contains(-)) {range range.substring(range.lastIndexOf() 1).trim();String[] ranges range.split(-);//判断range的类型if (ranges.length 1) {//类型一bytes-2343if (range.startsWith(-)) endByte Long.parseLong(ranges[0]);//类型二bytes2343-if (range.endsWith(-)) startByte Long.parseLong(ranges[0]);}//类型三bytes22-2343else if (ranges.length 2) {startByte Long.parseLong(ranges[0]);endByte Long.parseLong(ranges[1]);}}//要下载的长度long contentLength endByte - startByte 1;//文件类型String contentType request.getServletContext().getMimeType(filename);//解决下载文件时文件名乱码问题byte[] fileNameBytes filename.getBytes(StandardCharsets.UTF_8);filename new String(fileNameBytes, 0, fileNameBytes.length, StandardCharsets.ISO_8859_1);//各种响应头设置---------------------------------------------------------------------------------------------//支持断点续传获取部分字节内容response.setHeader(Accept-Ranges, bytes);//http状态码要为206表示获取部分内容,SC_PARTIAL_CONTENT,部分浏览器不支持所以改成SC_OKresponse.setStatus(HttpServletResponse.SC_OK);response.setContentType(contentType);response.setHeader(Last-Modified, statObjectResponse.lastModified().toString());//inline表示浏览器直接使用attachment表示下载fileName表示下载的文件名response.setHeader(Content-Disposition, attachment;filename filename);response.setHeader(Content-Length, String.valueOf(contentLength));//Content-Range格式为[要下载的开始位置]-[结束位置]/[文件总大小]response.setHeader(Content-Range, bytes startByte - endByte / statObjectResponse.size());response.setHeader(ETag, \.concat(statObjectResponse.etag()).concat(\));response.setContentType(application/octect-stream;charsetUTF-8);try {// 获取文件流stream minioClient.getObject(GetObjectArgs.builder().bucket(statObjectResponse.bucket()).object(statObjectResponse.object()).offset(startByte).length(contentLength).build());os new BufferedOutputStream(response.getOutputStream());// 将读取的文件写入到OutputStreambyte[] buffer new byte[1024];long bytesWritten 0;int bytesRead -1;while ((bytesRead stream.read(buffer)) ! -1) {if (bytesWritten bytesRead contentLength) {os.write(buffer, 0, (int) (contentLength - bytesWritten));break;} else {os.write(buffer, 0, bytesRead);bytesWritten bytesRead;}}os.flush();response.flushBuffer();log.info(下载完毕);// 返回对应http状态responseEntity new ResponseEntitybyte[](buffer, HttpStatus.OK);} finally {if (os ! null) os.close();if (stream ! null) stream.close();}}return responseEntity;} }测试链接 下50M的情况 http://localhost:8082/download?filenamea9500aa2091875f3d02a9b84ae1ab712.mp4rangebytes0-52428800 从50m再次下载50m http://localhost:8082/download?filenamea9500aa2091875f3d02a9b84ae1ab712.mp4rangebytes52428800-104857600 都下载到了前端本地以后由客户端进行合并操作就好了。
http://www.zqtcl.cn/news/637333/

相关文章:

  • 如何选择品牌网站建设做网站容易吧
  • 广州建网站比较有名的公司提升学历英语翻译
  • php网站开发视频教程厦门网站建设公司首选乐振
  • 网站推广项目微信小程序登陆入口
  • 建设部监理协会网站微信公众平台开发微网站
  • 莆田cms建站模板现在可以做网站么
  • windows 建网站湖北省最新消息今天
  • 手机商场网站制作在线看网站源码
  • 云南建设厅网站房地产开发资质做哪一类网站能赚钱
  • 佛山优化网站关键词创作者服务平台
  • python做网站多少钱超级商城系统
  • 网站开发pc端和手机端长沙专业个人做网站哪家好
  • 永州网站建设收费标准天长网站开发
  • 做网站分辨率多少钱装修公司10强排名
  • 营销网站建设818gx在南宁做家教兼职的网站
  • 做杂志模板下载网站网站开发产品经理招聘
  • 深圳网站创建公司小程序代理怎么样
  • 所以免费爱做网站营销网站优化推广
  • 莆田网站制作设计东莞营销专业网站建设
  • joomla建站教程北京做网站ezhixi
  • 自己可以做拼单网站吗建设企业网站有哪些
  • 张掖北京网站建设新闻事件
  • 济南网站建设(力选聚搜网络)wordpress文章中写代码
  • 网站后台忘记密码买购网十大品牌网
  • 360免费建站网页链接石家庄建设局网站怎么打不开
  • 东莞网站建做俄罗斯外贸的网站
  • 基于vue.js旅游网站开发网络营销的主要形式有建设网站
  • 医院网站建设要素国外电商网站
  • 甘肃两学一做网站可以制作h5的网站
  • 微信公众号手机网站开发wordpress 集赞系统