Blob的一些使用 - 下载、图片预览、切片上传

Blob

Blob: 前端专门用于支持文件操作的二进制对象
File: 一种特殊的Blob对象

文件下载

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<a id="a1">点击下载</a>
	<script>
		// 获取a标签的dom
		const a1 = document.getElementById("a1");
		const content = '<div><h1>JS++</h1><p>Hello</p></div>'
		const blob = new Blob()
		console.log(blob)
	</script>
</body>
</html>

在这里插入图片描述

我们可以看到blob对象第一个参数需要一个数组,第二个参数是对blob对象的描述
所以对其进行传参

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<a id="a1">点击下载</a>
	<script>
		// 获取a标签的dom
		const a1 = document.getElementById("a1");
		const content = '<div><h1>JS++</h1><p>Hello</p></div>'
		const blob = new Blob([content], {
			type: 'text/html'
		})
		URL.createObjectURL()
	</script>
</body>

</html>

我们通过URL.createObjectURL可以生成一个url地址 ,此方法需要一个blob对象
在这里插入图片描述

此时我们给a标签设置href连接

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<a id="a1">点击下载</a>
	<script>
		// 获取a标签的dom
		const a1 = document.getElementById("a1");
		const content = '<div><h1>JS++</h1><p>Hello</p></div>'
		const blob = new Blob([content], {
			type: 'text/html'
		})
		a1.href = URL.createObjectURL(blob)
		a1.setAttribute('download', '下载.html')
	</script>
</body>

</html>

此时点击下载就可以成功下载并预览
在这里插入图片描述
在这里插入图片描述

文件预览

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="fileInput">
	<script>
		const fileInput = document.getElementById("fileInput")
		fileInput.addEventListener('change', (e) => {
			console.log(e.target.files);
		})
	</script>
</body>

</html>

我们可以看到e.target.files表示文件对象

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="fileInput">
	<script>
		const fileInput = document.getElementById("fileInput")
		fileInput.addEventListener('change', (e) => {
			const file = e.target.files[0];
			const fileReader = new FileReader();
			// 生成base64图片
			fileReader.readAsDataURL(file)
			fileReader.onload = function () {
				console.log(fileReader.result)
			}
		})
	</script>
</body>

</html>

在这里插入图片描述这里先使用fileReader来实现预览功能
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="fileInput">
	<script>
		const fileInput = document.getElementById("fileInput")
		fileInput.addEventListener('change', (e) => {
			const file = e.target.files[0];
			const fileReader = new FileReader();
			// 生成base64图片
			fileReader.readAsDataURL(file)
			fileReader.onload = function () {
				const src = fileReader.result;
				const img = document.createElement("img");
				img.src = src
				document.body.appendChild(img);
			}
		})
	</script>
</body>

</html>

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="fileInput">
	<script>
		const fileInput = document.getElementById("fileInput")
		fileInput.addEventListener('change', (e) => {
			const file = e.target.files[0];
			const url = URL.createObjectURL(file)
			const img = document.createElement("img");
			img.src = url
			document.body.appendChild(img);
			// 销毁临时的url
			img.onload = function () {
				URL.revokeObjectURL(url);
			}
		})
	</script>
</body>

</html>

在这里插入图片描述

分片上传

我们先使用koa开启一个服务器

npm init -y 初始项目
npm install koa koa-router koa-static koa-bodyparser
const Koa = require('koa')
const Router = require('koa-router')
const static = require('koa-static')
const parser = require('koa-bodyparser')

const app = new Koa()

app.listen(3000, () => {
	console.log('server listen at port 3000')
})
npm install nodemon -g

配置脚本
在这里插入图片描述
在这里插入图片描述
运行

npm run dev

在这里插入图片描述
koa-parser用来处理post请求
koa-static用来创建静态资源

const Koa = require('koa')
const Router = require('koa-router')
const server = require('koa-static')
const Parser = require('koa-bodyparser')

const app = new Koa()

// 注册Parser中间件 就可以解析post过来的body数据
app.use(Parser())

// 使用server中间件 可以将文件夹作为静态文件目录
app.use(server(__dirname + '/public'))


app.listen(3000, () => {
	console.log('server listen at port 3000')
})

multiparty将上传文件保存到临时目录

const Koa = require('koa')
const Router = require('koa-router')
const server = require('koa-static')
const Parser = require('koa-bodyparser')
const multiparty = require('multiparty')

const app = new Koa()
const router = new Router()

// 注册Parser中间件 就可以解析post过来的body数据
app.use(Parser())

// 使用server中间件 可以将文件夹作为静态文件目录
app.use(server(__dirname + '/public'))

router.post('/upload', async (ctx, next) => {
	const form = new multiparty.Form({ uploadDir: 'temp' })
	ctx.body = '上传成功'
})

app.use(router.routes())

app.listen(3000, () => {
	console.log('server listen at port 3000')
})

增加上传功能

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="file1" />
	<button id="btn1">上传</button>
	<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
	<script>
		const btn1 = document.getElementById('btn1');
		btn1.addEventListener('click', () => {
			const file1 = document.getElementById('file1');
			const file = file1.files[0]
			const formData = new FormData()
			formData.append('file', file)

			axios.post('/upload', formData)
		})
	</script>
</body>

</html>
const Koa = require('koa')
const Router = require('koa-router')
const server = require('koa-static')
const Parser = require('koa-bodyparser')
const multiparty = require('multiparty')

const app = new Koa()
const router = new Router()

// 注册Parser中间件 就可以解析post过来的body数据
app.use(Parser())

// 使用server中间件 可以将文件夹作为静态文件目录
app.use(server(__dirname + '/public'))

router.post('/upload', async (ctx, next) => {
	const form = new multiparty.Form({ uploadDir: 'temp' })
	form.parse(ctx.req)
	form.on('file', () => {
		
	})
	ctx.body = '上传成功'
})

app.use(router.routes())

app.listen(3000, () => {
	console.log('server listen at port 3000')
})

在这里插入图片描述

在这里插入图片描述

分片上传

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>

<body>
	<input type="file" id="file1" />
	<button id="btn1">上传</button>
	<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.6/axios.js"></script>
	<script>
		const btn1 = document.getElementById('btn1');

		//10 kb
		const chunkSize = 1034 * 10
		let index = 0

		btn1.addEventListener('click', upload)

		function upload() {
			const file1 = document.getElementById('file1');
			const file = file1.files[0]
			// 解构出文件名和扩展名
			const [filename, fileext] = file.name.split('.')
			// 获取文件大小
			const fileSize = file.size

			let start = index * chunkSize
			// 如果切片初始值 大于文件大小 就不切片
			if (start > fileSize) {
				return
			}
			const blob = file.slice(start, start + chunkSize)
			const blobName = `${filename}.${index}.${fileext}`
			const blobFile = new File([blob], blobName)

			const formData = new FormData()
			formData.append('file', blobFile)
			axios.post('/upload', formData).then(() => {
				index++
				// 递归发送请求
				upload(index)
			})
		}
	</script>
</body>

</html>

分片上传成功
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_聪明勇敢有力气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值