图片文件的分片加载实现,前后端代码, fetch + koa2

先上代码:
前端代码, fetch请求

  const rangeImge = () => {
      const totalSize = 924087
      const chunkSize = 300000
      const numChunks = Math.ceil(totalSize / chunkSize)
      let chunk = new Blob()
      let index = 0
      send()
      function send() {
        if (index >= numChunks) return
        const start = index * chunkSize
        const end = Math.min(start + chunkSize - 1, totalSize - 1)
        fetch('imageurl', {
          headers: { Range: `bytes=${start}-${end}` },
        })
          .then((response) => {
            return response.blob()
          })
          .then((blob) => {
            index++
            send()
            chunk = new Blob([chunk, blob], { type: 'image/png' })
            const url = URL.createObjectURL(chunk)
            console.log(111, chunk)
            image.src = url
          })
      }
    }

后端 node koa2代码

router.get('/imageRange', async (ctx) => {
  const filePath = path.join(__dirname, 'image.png')
  const stat = fs.statSync(filePath)
  const fileSize = stat.size
  ctx.set('Content-Type', 'image/png')
  ctx.set('Accept-Ranges', 'bytes')

  const rangeHeader = ctx.header.range
  if (rangeHeader) {
    const parts = rangeHeader.replace(/bytes=/, '').split('-')
    const start = parseInt(parts[0], 10)
    const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1
    const chunkSize = end - start + 1
    ctx.status = 206

    ctx.set('Content-Range', `bytes ${start}-${end}/${fileSize}`)
    ctx.set('Content-Length', chunkSize)

    const fileStream = fs.createReadStream(filePath, { start, end })

    ctx.body = fileStream
  } else {
    ctx.set('Content-Length', fileSize)
    ctx.body = fs.createReadStream(filePath)
  }
})

可以看见发了数个请求,每个请求的请求头都带上了range字段

请求头中会带上一个start 和一个 end 代表要获取的数据范围

响应头中会返回一个content-range字段,告知当前返回的数据范围和总的数据量

然后你就能看到图片从上到下,一点点的拼上去了

在这里插入图片描述

在这里插入图片描述
请求头

要点

  • 如果只是想获取start为0, end为任意值的片段,也就是第一个任意大小的片段,可以直接拿到返回的数据,然后直接设置为img的src,不用blob处理,这里是可以直接显示获取的片段的。
  • 如果start 不为0, 也就是获取的不是第一个片段,那么必须用blob处理数据,并且还要按照片段顺序拼接好,才能正确的显示图片。
  • 也可以用arrayBuffer处理数据的拼接。
  • 后端需要自己实现对range的支持。
1、这个软件使用C#编写,需要.NET Framework 4.0运行环境。 2、建议“新建文件夹”来保存分割后的图片,因为程序会自动清空该文件夹下所有文件。 3、这个软件可以对图片进行,行与列的分割。如果大家按块对图片进行行分割,那么分割列数填写1,分割行书填写自己要分割的行;如果大家按块数想对列分割,那么分割列数填写要分割的列数,分割行数填写1。如果大家按像素对图片进行横向切割,那么像素宽度填写1,高度随便写;如果按像素对图片进行纵向切割,那么像素高度填写1,像素宽度随便写。 4、分割图片的耗时跟图片大小、切割块数的多少有直接关系。另外,图片在切割的时候无论何种切割方式都是将图片读取到内存中进行切割,所以注意一下自己机器内存的大小,以及图片的大小。以免内存报错。 5、从网上直接加载图片时候,图片类型只能为jpg或者png格式,其他类型的图片暂不支持。另外,在输入时一定要输入“http://”或"https://",输入完毕后按回车键。 6、图片九宫格合并,主要在文件的命名上,文件名以数字开头,类似于“0_0.jpg”这样的文件名,其中第一个0代表行,第二个0代表列,0_0这样的文件名是指第一行,第一张图片,0_1是指第一行,第二张图片,0_2是指第一行,第三张图片以此类推。具体看文章上方关于九宫格的图片说明。 7、由于程序在编译的时候使用了代码保护软件进行保护,所以在运行的时候360之类的软件会有报警,如果大家很在意360之类的报警提示的话。那就绕行吧。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值