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

长春网站运做思路网页数据抓取

长春网站运做思路,网页数据抓取,wordpress改模板教程视频,wordpress 注册邮箱前言 在开发Web应用时,文件上传是一个常见需求。然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余。此时可以使用文件秒传技术通过识别重复文件,实现瞬间完成上传的效果,大大提升了用户体验…

前言

在开发Web应用时,文件上传是一个常见需求。然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余。此时可以使用文件秒传技术通过识别重复文件,实现瞬间完成上传的效果,大大提升了用户体验和系统效率。

文件秒传原理

文件秒传的核心原理是:

  1. 计算文件唯一标识(通常是MD5或SHA256值)
  2. 上传前先检查服务器是否已存在相同标识的文件
  3. 若存在,则直接引用已有文件,无需再次上传
  4. 若不存在,则执行常规上传流程

这种方式能显著减少网络传输避免存储冗余

代码实现

1. 创建项目基础结构

首先创建Spring Boot项目,添加必要依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.18</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.1</version></dependency>
</dependencies>

2. 创建上传存储代码

此处使用一个简单的集合来存储文件信息,实际使用需要替换为数据库或其他持久化中间件。

import cn.hutool.crypto.digest.DigestUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;@Service
public class FileService {// 使用Map存储文件信息,key为MD5,value为文件信息(实际使用时可替换为数据库存储)private final Map<String, FileInfo> fileStore = new ConcurrentHashMap<>();/*** 检查文件是否已存在*/public FileInfo findByMd5(String md5) {return fileStore.get(md5);}/*** 保存文件信息*/public FileInfo saveFile(String fileName, String fileMd5, Long fileSize, String filePath) {FileInfo fileInfo = new FileInfo(fileName, fileMd5, fileSize, filePath);fileStore.put(fileMd5, fileInfo); // 实际使用时插入数据库return fileInfo;}/*** 计算文件MD5*/public String calculateMD5(MultipartFile file) throws IOException {return DigestUtil.md5Hex(file.getInputStream());}
}

定义一个简单的文件信息实体类:

import cn.hutool.core.util.IdUtil;public class FileInfo {private String id = IdUtil.fastUUID();private String fileName;private String fileMd5;private Long fileSize;private String filePath;public FileInfo(String fileName, String fileMd5, Long fileSize, String filePath) {this.fileName = fileName;this.fileMd5 = fileMd5;this.fileSize = fileSize;this.filePath = filePath;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String getFileMd5() {return fileMd5;}public void setFileMd5(String fileMd5) {this.fileMd5 = fileMd5;}public Long getFileSize() {return fileSize;}public void setFileSize(Long fileSize) {this.fileSize = fileSize;}public String getFilePath() {return filePath;}public void setFilePath(String filePath) {this.filePath = filePath;}
}

3. 创建Result类

为了统一返回结果格式,可以创建一个简单的Result类。

public class Result {private boolean success;private Object data;private String message;public Result(boolean success, Object data, String message) {this.success = success;this.data = data;this.message = message;}public static Result success(Object data) {return new Result(true, data,"success");}public static Result success(Object data,String message) {return new Result(true, data,message);}public static Result error(String message) {return new Result(false, null, message);}// Getterspublic boolean isSuccess() { return success; }public Object getData() { return data; }public String getMessage() { return message; }
}

4. 创建Controller控制器

import cn.hutool.core.io.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;@RestController
@RequestMapping("/api/file")
public class FileController {private static Logger logger = LoggerFactory.getLogger(FileController.class);@Autowiredprivate FileService fileService;/*** 检查文件是否已存在*/@PostMapping("/check")public Result checkFile(@RequestParam("md5") String md5) {FileInfo fileInfo = fileService.findByMd5(md5);if (fileInfo != null) {return Result.success(fileInfo);}return Result.success(null);}/*** 上传文件*/@PostMapping("/upload")public Result uploadFile(@RequestParam("file") MultipartFile file) {try {// 计算文件MD5值String md5 = fileService.calculateMD5(file);// 检查文件是否已存在FileInfo existFile = fileService.findByMd5(md5);if (existFile != null) {// todo 进行自定义的逻辑处理return Result.success(existFile,"文件秒传成功");}// 文件不存在,执行上传String originalFilename = file.getOriginalFilename();String filePath = FileUtil.getTmpDir() + File.separator + originalFilename; // 保存到临时目录// 存储文件file.transferTo(new File(filePath));// 保存文件信息到内存(实际使用时应替换为数据库)FileInfo fileInfo = fileService.saveFile(originalFilename, md5, file.getSize(), filePath);return Result.success(fileInfo,"文件上传成功");} catch (Exception e) {logger.error(e.getMessage(),e);return Result.error("文件上传失败:" + e.getMessage());}}
}

4. 创建纯HTML前端页面

创建一个简单的HTML上传页面:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>文件秒传示例</title><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><script src="https://cdn.jsdelivr.net/npm/spark-md5@3.0.2/spark-md5.min.js"></script>
</head>
<body><h2>文件上传(支持秒传)</h2><input type="file" id="fileInput" /><button onclick="uploadFile()">上传文件</button><div id="progressBar" style="display:none;"><div>上传进度:<span id="progress">0%</span></div></div><div id="result"></div><script>function uploadFile() {const fileInput = document.getElementById('fileInput');const file = fileInput.files[0];if (!file) {alert('请选择文件');return;}document.getElementById('progressBar').style.display = 'block';document.getElementById('result').innerText = '计算文件MD5中...';// 计算文件MD5calculateMD5(file).then(md5 => {document.getElementById('result').innerText = '正在检查文件是否已存在...';// 检查文件是否已存在return axios.post('/api/file/check', {md5: md5}).then(response => {if (response.data.data && response.data.data.id) {// 文件已存在,执行秒传document.getElementById('result').innerText = '文件秒传成功!';document.getElementById('progress').innerText = '100%';return Promise.resolve();} else {// 文件不存在,执行上传const formData = new FormData();formData.append('file', file);return axios.post('/api/file/upload', formData, {onUploadProgress: progressEvent => {const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);document.getElementById('progress').innerText = percentCompleted + '%';}}).then(response => {document.getElementById('result').innerText = '文件上传成功!';});}});}).catch(error => {document.getElementById('result').innerText = '错误:' + error.message;});}// 计算文件MD5function calculateMD5(file) {return new Promise((resolve, reject) => {const blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;const chunkSize = 2097152; // 2MBconst chunks = Math.ceil(file.size / chunkSize);let currentChunk = 0;const spark = new SparkMD5.ArrayBuffer();const fileReader = new FileReader();fileReader.onload = function(e) {spark.append(e.target.result);currentChunk++;if (currentChunk < chunks) {loadNext();} else {resolve(spark.end());}};fileReader.onerror = function() {reject('文件读取错误');};function loadNext() {const start = currentChunk * chunkSize;const end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));}loadNext();});}</script>
</body>
</html>

5. 配置文件

application.yml中添加必要配置

server:port: 8080spring:servlet:multipart:max-file-size: 100MBmax-request-size: 100MB

效果

第一次上传

在这里插入图片描述

第二次上传

在这里插入图片描述


文章转载自:

http://Ay9IIP70.hrnrx.cn
http://VKi2sToO.hrnrx.cn
http://y1XtYnz0.hrnrx.cn
http://6Pvu2Vlq.hrnrx.cn
http://nt7mkLLs.hrnrx.cn
http://x3qf9qyc.hrnrx.cn
http://hiTfIgvu.hrnrx.cn
http://uAYHpj86.hrnrx.cn
http://2niNXeXR.hrnrx.cn
http://vG3HPsQ8.hrnrx.cn
http://ctSH6sFQ.hrnrx.cn
http://xlIgndbJ.hrnrx.cn
http://w5dhWkyD.hrnrx.cn
http://rV0jtm29.hrnrx.cn
http://At7MjH3N.hrnrx.cn
http://tGSh3hhK.hrnrx.cn
http://PkI8jp7j.hrnrx.cn
http://r3n8wzAc.hrnrx.cn
http://GluYKcRD.hrnrx.cn
http://dQg6z9Ha.hrnrx.cn
http://PbhfIlzP.hrnrx.cn
http://s9mkJafG.hrnrx.cn
http://BUAUViB1.hrnrx.cn
http://8cDfPHlz.hrnrx.cn
http://AjCZuX7J.hrnrx.cn
http://n9fNaCA3.hrnrx.cn
http://rMPjBRFl.hrnrx.cn
http://dlKwyWq8.hrnrx.cn
http://pBM4AXYW.hrnrx.cn
http://crb6CSSU.hrnrx.cn
http://www.dtcms.com/wzjs/688539.html

相关文章:

  • 现在还有网站做校内网吗wordpress503原因
  • 网站设计师培训wordpress积分充值插件
  • wordpress网站搬家换域名下载app赚钱的平台
  • 马达加工东莞网站建设昌平做网站公司
  • 论坛网站建设公司重庆做网站建设找谁
  • 网站开发系统调研目的网络公司经营范围能写建材吗
  • 家庭宽带做网站大企业网站样式
  • 河南教育平台网站建设网站建设账务处理属于什么费用
  • 徐州cms建站外贸网站优化软件
  • 漳州优化网站建设电商网站都是用什么做的
  • jquery做的网站网站建设咨询问卷
  • 网站开发技术前景最好北京燕郊网站建设
  • fireworks个人网站模板猫咪网站模版下载
  • 泉州建网站wordpress 获取图片
  • 门户网站建设需求文档wordpress添加邀请码输入框
  • 网站开发五人分工网站模板分享
  • 商贸企业网站建设设计方案盐城网站建设
  • 云南建设网官方网站工业设计网站有那些
  • 济南网站制作公司网站建设好的公司专业服务
  • 网页二级网站怎么做网站建设静态网页
  • 网站开发专利申请英文网站建设方案 ppt模板
  • 做问卷赚钱最好似网站公司的网站建设费进入什么科目
  • i18n wordpress厦门网站优化服务
  • 国外网站网站app赣州万图网络科技有限公司
  • 网站备案被注销注册深圳公司多少钱
  • 怎么查网站后台地址网站风格配置怎么做
  • 网站的运作流程西安网站挂标
  • 08网站建设沈阳营销型网站建设
  • wordpress 站群模板网站开发教程图文
  • 外链发布网站网络营销的概念可译为