走了不少弯路,把问题搞复杂了。开始以为文件流就是分片下载,其实不是。
旧版的pdf.js好像不需要设置,自动就是支持分片加载的。
1 服务端golang beego
http.serverfile本身自动支持分片下载的,不用操心。
// @Title dowload standardpdf
// @Description get standardpdf by id
// @Param id path string true "The id of standardpdf"
// @Success 200 {object} models.GetAttachbyId
// @Failure 400 Invalid page supplied
// @Failure 404 pdf not found
// @router /downloadstandard/:id [get]
// 下载pdf
func (c *StandardController) DownloadStandard() {
id := c.Ctx.Input.Param(":id")
//pid转成64为
idNum, err := strconv.ParseInt(id, 10, 64)
if err != nil {
beego.Error(err)
}
//根据id取得规范的路径
standard, err := models.GetStandard(idNum)
if err != nil {
beego.Error(err)
}
fileurl := strings.Replace(standard.Route, "/attachment/", "attachment/", -1)
filename := path.Base(fileurl)
fileext := path.Ext(filename)
filepath := strings.Replace(standard.Route, "/attachment/", "./attachment/", -1)
http.ServeFile(c.Ctx.ResponseWriter, c.Ctx.Request, filepath)//这个自动支持分片下载
}
2 前端
viewer.html页面不需要修改。如果需要,则修改viewer.js和pdf.js等引用文件位置
修改一下web\viewer.js
disableAutoFetch: {
value: true,//false,
kind: OptionKind.API + OptionKind.PREFERENCE
},
修改引用位置,如果没问题,则不需要修改
workerSrc: {
value: "/static/pdf/build/pdf.worker.js",
kind: OptionKind.WORKER
}
修改引用位置,如果没问题,则不需要修改
defaultOptions.sandboxBundleSrc = {
value: "/static/pdf/build/pdf.sandbox.js",
kind: OptionKind.VIEWER
};
修改build\pdf.js 中分片大小
const DEFAULT_RANGE_CHUNK_SIZE = 65536*16;//*16即分片为1M
修改引用位置,如果没有问题,则不需修改
if (_is_node.isNodeJS && typeof require === "function") {
isWorkerDisabled = true;
fallbackWorkerSrc = "/static/pdf/build/pdf.worker.js";
} else if (typeof document === "object" && "currentScript" in document) {
用一个40M的文件测试一下,效果如下:
相关知识:
实现过pdf.js默认一次性加载所有page,加载整个pdf - 53BK报刊网
pdf.js的一些参数:
initialData TypedArray 带有第一部分或全部pdf数据的类型化数组。由扩展使用,因为在切换到范围请求之前已经加载了一些数据。
disableRange 布尔 (可选)禁用PDF文件的范围请求加载。启用后,如果服务器支持部分内容请求,则将以块的形式提取PDF。默认值为“false”。
disableStream 布尔 (可选)禁用PDF文件数据的流式传输。默认情况下,PDF.js会尝试以块的形式加载PDF。默认值为“false”。
disableAutoFetch 布尔 (可选)禁用PDF文件数据的预取。启用范围请求后,即使不需要显示当前页面,PDF.js也会自动继续获取更多数据。默认值为“false”。注意:还必须禁用流式传输,请参阅上文,以便禁用预取功能以使其正常工作。
实现过pdf.js默认一次性加载所有page,加载整个pdf
disableRange设为 true 即可
这样可以pdf.js可以实现pdf文件页码的自动选择(不重复加载pdf文件)
在pdfjs发行包的web/viewer.js文件中,找到配置项disableAutoFetch,可以看到它的默认值是false,意味着会自动获取所有分片。
将它改为true,意味着关闭自动获取,它仅仅会下载所需要的分片,实现了按需加载。