使用nodejs功能化krpano流程回顾

发布: 2019-12-17 22:54:43标签: nodeJs

一、使用nodejs功能化krpano 流程简介

  1. 下载krpano

  2. 注册krpanotools(不注册会有水印)

01# 推荐购买,当然网上还是可以找到注册的密钥
02./krpanotools register ******
复制代码
  1. 使用nodejs运行执行krpanotool,进行文件切割,具体config配置介绍
01 ./krpanotools makepano -config=config文件路径 全景图片路径
复制代码
  1. 循环上传七牛生成切割后全景图片,然后使用根据路径使用代码拼接xml

  2. 制作docker镜像进行部署

二、代码片段

1. nodejs执行krpanotools切割全景图片

切割10000x5000的全景一般需要18-22s的时间,图片越小时间越少

01const execa = require("execa")
02const krpanotools = 'krpanotools 路径'
03const config = `config 路径`
04module.export = async () => {
05 const {stderr} = await execa(shell, {
06 shell: true
07 })
08 return stderr
09}
复制代码

2. 获取全景文件MD5,来作为切割文件前缀的key,也可以redis来缓存,提高性能

01// 获取文件md5
02const crypto = require("crypto");
03const fs = require("fs");
04
05module.exports = url => {
06 return new Promise(reslove => {
07 const md5sum = crypto.createHash("md5");
08 let stream = fs.createReadStream(url);
09 stream.on("data", chunk => {
10 md5sum.update(chunk);
11 });
12 stream.on("end", function() {
13 let fileMd5 = md5sum.digest("hex");
14 reslove(fileMd5);
15 });
16 });
17};
复制代码

3. 执行文件夹循环上传七牛

01// 指定目录上传
02module.exports = async (staticPath, prefix) => {
03 const promiseList = [];
04 // 上传文件夹
05 function uploadDir(dirPath) {
06 const files = fs.readdirSync(dirPath);
07 // 遍历目录下的内容
08 files.forEach(item => {
09 let path = `${dirPath}/${item}`;
10 const stats = fs.statSync(path);
11 if (stats.isDirectory()) {
12 uploadDir(path);
13 } else {
14 // 上传全景的key
15 const key = path.replace(staticPath, prefix);
16 promiseList.push(uploadFile(key, path));
17 }
18 });
19 return promiseList;
20 }
21 // 等待所有文件上传完成
22 return Promise.all(uploadDir(staticPath));
23};
复制代码

4. 服务器切割图片比较慢,打包zip后在服务器批量上传,使用了一个插件unzipper

三、Dockerfile

FROM ubuntu:18.04

LABEL author=luzhongk@126.com

ENV APP_ROOT /var/www/
# 注册krpanotools的key
ENV krpanoToken ******
# 复制文件之后krpanotools位置
ENV krpanotools /var/www/krpano/krpanotools
WORKDIR ${APP_ROOT}

# 注册krpano
RUN chmod +x ${krpanotools} && ${krpanotools} register ${krpanoToken}
# 安装node
RUN apt-get update && apt-get install nodejs -y && apt-get install npm -y
# 安装node依赖环境,分开拷贝借助缓存优化
COPY ./package.json ${APP_ROOT}
RUN npm config set registry http://registry.npm.taobao.org/ & npm i
# 复制项目
COPY . ${APP_ROOT}

EXPOSE 3000

CMD ["npm",  "start"]

四、 官方网址