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

杭州做网站需要多少钱2022年新闻摘抄简短

杭州做网站需要多少钱,2022年新闻摘抄简短,百度打网站名称就显示 如何做,如何做百度收录的网站大文件上传断点续传的实现逻辑 大文件上传断点续传的核心在于将文件分成多个小片段(分片),逐个上传这些片段到服务器,并记录已成功上传的部分。如果上传中断,可以基于之前保存的状态重新恢复未完成部分的上传过程。 …

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

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

实现逻辑的关键点
  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/487949.html

相关文章:

  • 温州网站链接怎么做三亚网络推广
  • wordpress文件执行顺序网络优化大师app
  • 个人网站需求分析淘宝关键词排名查询工具免费
  • 企业注册资金变更流程百度搜索引擎优化公司哪家强
  • 装饰设计说明seo推广技术培训
  • 网站首页模板自定义合肥优化排名推广
  • 分站城市网站如何做seo电子商务软文写作
  • 旅游网站建设流程步骤企业网址怎么申请
  • wordpress页面布局windows优化大师怎么下载
  • 网页代理proxy宁波优化seo是什么
  • 南京大型网站建设网络广告形式
  • 自己做淘宝客网站付费推广
  • 厦门网站建设公司排行榜seo自动优化软件下载
  • wordpress的默认密码是什么seo优化技术教程
  • 做一个网站花费多少钱信息推广
  • 淄博手机网站建设报价幽默软文广告经典案例
  • 做电商网站注意什么问题数字营销成功案例
  • 白头鹰网站一天可以做多少任务武汉seo优化顾问
  • 有什么做海报网站软文营销写作技巧有哪些?
  • 制作网站升上去福州关键词排名软件
  • 南京建设局网站首页百度广告太多
  • 网站绑定微信公众号黑科技推广软件
  • 做网站需要租服务器么系统优化app最新版
  • 重庆网站建设与推广北京seo代理商
  • 怎样健网站正规的计算机培训机构
  • 做淘宝有哪些货源网站企业查询网站
  • 做网站的公司都是小公司网站优化推广价格
  • 音乐网站系统源码官网seo是什么意思
  • 网站建设前端和后端网店怎么运营和推广
  • 华为公司网站建设目标公司seo推广营销网站