首页 > 其他分享 >pdfjs分片

pdfjs分片

时间:2023-05-09 14:44:06浏览次数:37  
标签:Ranges HttpContext Accept Current Length 分片 pdfjs Response

分片加载的实现是基于 HTTP-RANGE 的,即服务端的文件接口如果实现了HTTP-RANGE,pdf.js会默认去执行分

片加载的策略。

 

也就是第一次请求时,服务器返回200,同时返回响应头Accept-Ranges

Accept-Ranges: bytes (表明服务器支持分片加载)

Content-Length: 408244 (表明该文件的所有字节大小)

注意:

  1. 跨域
  2. 浏览器默认只允许js读取以下的响应头,而Accept-Ranges: bytes是不支持的,这就造成pdf.js读取Accept-Ranges时,读到了null值,认为你的服务器不支持分片,故整个文件下载了。

    解决方法:在服务端的返回响应头上增加:

    'Access-Control-Expose-Headers':'Accept-Ranges,Content-Range'

    这样pdf.js才能读取到Accept-Ranges响应头,进而执行分片的策略。

 

 1 public void GetRangeStreamByAttId(string id)
 2         {
 3             if (Guid.TryParse(id, out Guid Id))
 4             {
 5                 var att = AttachmentBLL.GetAttachment(Id);
 6                 if (att != null)
 7                 {
 8                     var serverPath = ConfigCenter.ServerUploadFilePath;
 9                     var file = $"{serverPath}{att.AttachmentPath}";
10                     int startByte, endByte, totalByte;
11                     using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
12                     {
13                         // 断点续传
14                         if (HttpContext.Current.Request.Headers.AllKeys.Any(a => a.ToLower() == "range"))
15                         {
16                             string[] range = Regex.Replace(HttpContext.Current.Request.Headers.GetValues("Range")[0], "[^0-9\\-]", "").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
17                             startByte = Convert.ToInt32(range[0]);
18                             totalByte = (int)stream.Length;
19 
20                             // 下载结束位置
21                             if (range.Length > 1)
22                             {
23                                 endByte = int.Parse(range[1]);
24                             }
25                             else
26                             {
27                                 endByte = totalByte - 1;
28 
29                             }
30                             // 返回http状态
31                             HttpContext.Current.Response.StatusCode = 206;
32                         }
33                         else
34                         {
35                             // 文件总大小
36                             totalByte = (int)stream.Length;
37                             // 下载起始位置
38                             startByte = 0;
39                             // 下载结束位置
40                             endByte = totalByte - 1;
41                             // 返回http状态
42                             HttpContext.Current.Response.StatusCode = 200;
43                         }
44                         // 需要下载字节数
45                         int length = endByte - startByte + 1;
46                         HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "Accept-Ranges,Content-Range");
47                         HttpContext.Current.Response.AddHeader("Accept-Ranges", "bytes");
48                         HttpContext.Current.Response.AddHeader("Content-Range", "bytes " + startByte + "-" + endByte + "/" + totalByte);
49                         HttpContext.Current.Response.ContentType = "application/octet-stream";
50                         HttpContext.Current.Response.AddHeader("Content-Length", length.ToString());
51                         using (BufferedStream bis = new BufferedStream(stream))
52                         {
53                             bis.Position = startByte;
54                             int len = 0;
55                             byte[] buff = new byte[1024 * 64];
56                             using (BufferedStream bos = new BufferedStream(HttpContext.Current.Response.OutputStream))
57                             {
58                                 while ((len = bis.Read(buff, 0, buff.Length)) != -1)
59                                 {
60                                     if (length <= len)
61                                     {
62                                         bos.Write(buff, 0, length);
63                                         break;
64                                     }
65                                     else
66                                     {
67                                         length -= len;
68                                         bos.Write(buff, 0, len);
69                                     }
70                                 }
71                             }
72                         }
73 
74                     }
75                     HttpContext.Current.Response.End();
76                 }
77             }
78             else throw new ExceptionCustom("参数错误");
79 
80         }

 

pdfjs需要修改

pdfjs支持pdf分页操作,无需单独再行添加js方法,找到view.js

1      "disableAutoFetch": true, //是否禁用自动获取,true为禁用自动获取,开启分页
2         "disableFontFace": false,
3         "disableRange": false, //是否禁用range获取文件,false表示支持分页请求头
4         "disableStream": true, //分页关键,是否禁用流的形式加载

 

 

标签:Ranges,HttpContext,Accept,Current,Length,分片,pdfjs,Response
From: https://www.cnblogs.com/liudd123/p/17384989.html

相关文章

  • linux上使用yum部署mongodb4.2+分片副本
    系统配置Linux是有文件句柄限制的,而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到这个数量。为防止服务因toomanyopenfiles错误出现宕机,这里需要对linux系统句柄数进行调整。##临时调整,系统重启即失效ulimit-SHn65535##永久调整,编辑/etc/security/limi......
  • 大文件分片上传前后端实现
    1.前端代码<template><divclass="upload_container"><el-progress:percentage="progressNum"/><inputtype="file"ref="file"@change="selectFile"/><el-buttontype=&qu......
  • MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片
    关键字:MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片对MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了。但是缩减集群(删除分片)这种一般很少用到。由于某服务器挂了,所以想送修之前必须把它上面的数据自动迁移到其他Shard上。以下......
  • C# WebUploader文件分片上传、断点续传
    1、添加引用<!--引入CSS--><linkrel="stylesheet"type="text/css"href="~/Scripts/webuploader-0.1.5/webuploader.css"><!--引入JS--><scripttype="text/javascript"src="~/Scripts/webuploader-0.1.5/w......
  • IP层会分片,为什么TCP层还需要MSS?
    MTU:一个网络包的最大长度,以太网一般为1500字节MSS:除去IP和TCP头部之后,一个网络包所能容纳的TCP数据的最大长度如果一个IP分片丢失,整个IP报文的所有分片都得重传。IP层进行分片传输没有效率:IP层没有超时重传机制,由传输层的TCP来负责超时和重传,当某个IP分片丢失后,接收方的IP层无法......
  • Spring Boot实现分片上传、断点续传、大文件极速秒传-备忘
    文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好......
  • centos7 mongodb4.4分片集群部署
    #创建mongo相应的目录mkdir-pv/data/app/mongodb/confmkdir-pv/data/app/mongodb/{configset,shared1,shared2,shared3}/logmkdir-pv/data/mongodb/{configset,shared1,shared2,shared3}/data #创建于用户,给权限useradd-s/sbin/nologin-Mmongodchown-Rmong......
  • JavaScript超大文件上传解决方案:分片断点上传(一)
    ​ 前段时间做视频上传业务,通过网页上传视频到服务器。视频大小小则几十M,大则1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制;2,请求时间过长,请求超时;3,传输中断,必须重新上传导致前功尽弃; 解决方案:1,修改服务端上传的限制配置;Nginx以......
  • 求PHP超大文件上传解决方案:分片断点上传(一)
    ​ PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间,超过这个时间就会报错3.memory_limit=50M 设置脚本可以分配的最大内存量,防止失控脚本占用过多内存,此......
  • 在Linux部署Redis代理Predixy实现数据分片
    前言本文以predixy-1.0.5为例,讲述Redis代理Predixy安装过程。Predixy是一款高性能全特征Redis代理,支持Redis-sentinel和Redis-cluster。作者拿其它常用代理做了性能测评,Predixy在各个维度性能都是最优的,与其他代理的功能对比。我们可以通过取模、随机、一致性哈希......