当前位置: 首页 > wzjs >正文

做请帖的网站淘宝站外引流推广方法

做请帖的网站,淘宝站外引流推广方法,高端品牌冰箱,wordpress没有安装主题选项卡大文件上传断点续传的实现逻辑 大文件上传断点续传的核心在于将文件分成多个小片段(分片),逐个上传这些片段到服务器,并记录已成功上传的部分。如果上传中断,可以基于之前保存的状态重新恢复未完成部分的上传过程。 …

大文件上传断点续传的实现逻辑

大文件上传断点续传的核心在于将文件分成多个小片段(分片),逐个上传这些片段到服务器,并记录已成功上传的部分。如果上传中断,可以基于之前保存的状态重新恢复未完成部分的上传过程。

实现逻辑的关键点
  1. 前端处理
    使用浏览器提供的 File APIBlob.slice() 方法来切割文件成若干个小块。每一块可以通过 HTTP 请求发送至服务器。

  2. 唯一标识符
    为了区分不同用户的上传请求以及同一文件的不同分片,通常会为每次上传生成唯一的标识符(UUID 或 MD5 值)。该标识符用于标记当前上传的任务状态。

  3. 进度跟踪与存储
    客户端通过本地缓存机制(如 IndexedDB、LocalStorage)或 Cookies 来记录已完成的分片编号;而服务端则维护一份全局状态表,用来验证哪些分片已经收到并持久化下来。

  4. 错误重试机制
    如果某个分片失败,则允许客户端自动尝试再次提交直到成功为止。这一步骤可通过设置定时器配合 Promise 链式调用来达成目标效果。

  5. 合并操作
    当所有分片都到达服务器之后,由后台程序负责按照顺序拼接回原始数据流形式最后写入磁盘成为完整的文档副本。


Vue3 中的具体实现示例

以下是基于 Vue3 的简单版代码框架:

<template><div><input type="file" @change="handleFileChange"/><button @click="uploadChunks">开始上传</button></div>
</template><script setup>
import { ref } from 'vue';const file = ref(null);
const chunkSize = 1 * 1024 * 1024; // 每次上传大小设为1M字节function handleFileChange(event) {file.value = event.target.files[0];
}async function uploadChunks() {const chunks = [];let currentChunk = 0;while (currentChunk * chunkSize < file.value.size) {const start = currentChunk * chunkSize;const end = Math.min(file.value.size, start + chunkSize);chunks.push({blob: file.value.slice(start, end),index: currentChunk,});currentChunk++;}for (let i = 0; i < chunks.length; i++) {try {await fetch('/api/upload', {method: 'POST',headers: { 'Content-Type': 'application/octet-stream' },body: chunks[i].blob,});console.log(`${i}块上传完毕`);} catch (error) {console.error('上传失败:', error.message);}}
}
</script>

React 中的具体实现示例

下面是一个利用 Hooks 构建的大致流程展示:

import React, { useState } from 'react';function App() {const [selectedFile, setSelectedFile] = useState(null);const handleChange = (event) => {setSelectedFile(event.target.files[0]);};const handleSubmit = async () => {if (!selectedFile) return alert('请选择要上传的文件');const CHUNK_SIZE = 1 * 1024 * 1024; // 设置每个chunk为1MBconst totalChunks = Math.ceil(selectedFile.size / CHUNK_SIZE);for (let i = 0; i < totalChunks; ++i) {const start = i * CHUNK_SIZE;const end = ((i + 1) * CHUNK_SIZE > selectedFile.size ? selectedFile.size : (i + 1) * CHUNK_SIZE);const formData = new FormData();formData.append('file', selectedFile.slice(start, end));formData.append('index', i.toString());try {const response = await fetch("/upload", {method: "POST",body: formData,});if (!response.ok) throw Error(response.statusText);} catch (err) {console.warn(err);}}};return (<><input type="file" onChange={handleChange}/><button onClick={handleSubmit}>Upload File</button></>);
}export default App;

Java Spring Boot 后端接收示例

Spring Boot 提供了强大的 RESTful 支持能力,在这里我们定义了一个简单的接口用以接受来自前端传递过来的数据包:

@RestController
@RequestMapping("/upload")
public class UploadController {private static final String UPLOAD_DIR = "/tmp/uploads/";@PostMapping(consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)public ResponseEntity<String> handleFilePart(@RequestBody byte[] bytes,@RequestParam Integer index,HttpServletRequest request) throws IOException {UUID taskId = extractTaskIdFromRequest(request); Path targetLocation = Paths.get(UPLOAD_DIR).resolve(taskId.toString()).resolve(index + ".part");Files.write(targetLocation, bytes);return ResponseEntity.status(HttpStatus.CREATED).body("Uploaded part:" + index);}private UUID extractTaskIdFromRequest(HttpServletRequest req){/* 解析header或者其他参数获取task id */return null;}@GetMapping("/{taskId}")public void mergeParts(@PathVariable String taskId)throws Exception{List<Path> parts=Files.walk(Paths.get(UPLOAD_DIR)).filter(p->p.toAbsolutePath().toString().contains(taskId+"\\")).sorted().collect(Collectors.toList());RandomAccessFile raf=new RandomAccessFile(new File(UPLOAD_DIR+File.separator+taskId+".final"), "rw");for(Path p:parts){FileInputStream fis=new FileInputStream(p.toString());byte [] buffer=new byte[(int)p.toFile().length()];fis.read(buffer);raf.write(buffer);fis.close();            }raf.close();deleteTempFolderIfNecessary(parts.stream().map(Path::toFile).toArray(File[]::new));      }private void deleteTempFolderIfNecessary(File...filesToDelete){/*清理临时目录*/}
}
http://www.dtcms.com/wzjs/532232.html

相关文章:

  • 好的建筑设计网站冯站长之家官网
  • 重庆主页网站建设收录查询
  • 北京网站代理备案互联网推广软件
  • 网站开发李沛杰推广策略有哪些方法
  • 国内包装设计网站海外网站推广的公司
  • 阿里备案成功后怎么做网站谷歌seo搜索优化
  • 3d建模视频教学台州seo排名优化
  • 网站推广方式组合网上做推广怎么收费
  • 家具网站建设比较好的百度app首页
  • 只做同城交易的网站石家庄最新新闻事件
  • 东凤镇做网站公司百度官方推广平台
  • 南京网站建设案例新榜数据平台
  • 奉贤长沙网站建设朝阳seo建站
  • 专业网站建设设计seo排名优化软件价格
  • 做全景哪个网站不模糊东莞网站推广策划
  • 潍坊网站制作 熊掌号东莞seo排名外包
  • wordpress 网站图标免费域名注册平台
  • 专门做ppt的网站名称沈阳专业网站seo推广
  • 门户网站开发报价单自媒体seo是什么意思
  • 做fpga的网站seo产品是什么意思
  • 做网站搞个物理服务器百度搜索热度排名
  • 网站怎么做自适应百度秒收录技术
  • 网站建设寻求简述seo和sem的区别
  • 怎么在南京人社网站做失业登记网络推广的工作内容
  • 音乐分享网站源码全国互联网营销大赛官网
  • 建站优化是什么关键词优化seo多少钱一年
  • 北京网站平台建设重庆seo全面优化
  • wordpress的分享插件下载地址企业站seo
  • 无锡网站制作哪里有怎么建立网站的步骤
  • 网站开发技术题目国内推广平台有哪些