文件上传下载系列——如何实现文件秒传

news2024/12/23 9:36:29

文章目录

🎃简介:

👻核心思想:

MD5是什么?

实现步骤:

🎄实操:

1、java生成文件MD5码

2、javascript生成文件MD5码

⛳️基于秒传的分片上传下载

上传:

下载:

🍢MD5存储位置

1、持久化到数据库中

2、存储到redis中

🎋总结


🎃简介:

        文件秒传是指在文件上传过程中,如果上传的文件已经在服务器中存在,那么服务器会直接将已经存在的文件的信息返回给客户端,而不需要客户端再次上传文件,从而实现文件的秒传。所以,无论任何大小、格式的文件都可以实现秒传。

        文件秒传通常在云存储和文件共享服务中应用广泛。这种技术能够节省用户上传大文件的时间和带宽,提高文件传输的效率和速度。

        例如,百度云盘、阿里云OSS、腾讯云COS等云存储服务都支持文件秒传技术。

👻核心思想:

        将文件压缩成128位的MD5哈希值,只要修改文件内容,MD5码就会改变,用MD5码来判断是否是同一文件。

        将MD5码存到数据库中,当有文件上传,首先查询MD5码是否重复,如果重复则不需要上传,通过这种形式实现文件的秒传。

MD5是什么?

 

        MD5是一种信息摘要算法,原理是通过将输入数据分块,并对每个数据块进行填充、迭代压缩和更新哈希值的方式,最终得到一个128位的哈希值。

  • 不可逆性:信息摘要算法对原数据进行了压缩,无法逆向推导出原始数据
  • 唯一性:由于MD5哈希函数的输出长度为128位,因此总共可以生成2^128个不同的哈希值。(但也是有可能存在哈希碰撞的风险,在一些对安全性要求较高的应用场景下,建议使用更加安全的哈希算法,如SHA-2、SHA-3等)
  • 高效性:MD5算法的设计相对简单,它主要由四个轮函数和一个级联结构组成,这些运算和函数能够快速地对输入数据进行处理,从而提高了算法的执行效率;将输入数据分块,消息块之间的处理是相互独立的,因此可以并行处理,从而提高了处理的效率。

实现步骤:

        文件秒传的实现可以分为以下几个步骤:

  1. 客户端向服务器发送一个上传请求,包含要上传的文件的信息(例如文件名、大小、MD5值等)。
  2. 服务器根据客户端提供的文件信息,查询服务器上是否已经存在相同的文件,如果存在则返回文件已经存在的标识。
  3. 前端接到消息,显示已上传成功。

🎄实操:

1、java生成文件MD5码

        引入的文件

  • java.security.MessageDigest类中有MD5、SHA等加密算法的实现,这里使用其中的MD5算法实现。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
 * 生成文件的MD5值
 * @param filePath 文件路径
 * @return 文件的MD5值
 */
public static String getFileMD5(String filePath) {
    FileInputStream fis = null;
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        fis = new FileInputStream(new File(filePath));
        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) != -1) {
            md.update(buffer, 0, length);
        }
        byte[] digest = md.digest();
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    } catch (NoSuchAlgorithmException | IOException e) {
        e.printStackTrace();
        return null;
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

        调用的示例代码:

/**
 * 秒传
 */
public void quickLoad() {
    String filePath = "E:\\DRP.avi"; // 文件路径
    String md5 = getFileMD5(filePath);
    System.out.println(md5); // 输出文件的MD5值
}

        生成的MD5码:

2、javascript生成文件MD5码

function generateFileMD5(file, callback) {
  const reader = new FileReader();
  reader.readAsArrayBuffer(file);
  reader.onload = () => {
    const buffer = reader.result;
    const crypto = window.crypto || window.msCrypto;
    const digestAlgorithm = "MD5";
    const cryptoSubtle = crypto.subtle || crypto.webkitSubtle;
    cryptoSubtle.digest(digestAlgorithm, buffer)
      .then((digest) => {
        const hashArray = Array.from(new Uint8Array(digest));
        const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
        callback(hashHex);
      })
      .catch((error) => {
        console.error(error);
      });
  };
}

        调用此函数时,需要传入文件对象和回调函数。回调函数将在计算MD5值完成后被调用,并且它将接收计算出的MD5值作为参数。以下是调用该函数的示例代码:

const file = document.getElementById("file-input").files[0]; // 获取文件对象
generateFileMD5(file, (hash) => {
  console.log(hash); // 输出文件的MD5值
});


⛳️基于秒传的分片上传下载

        分片上传是指将一个大文件拆分成多个小块进行上传,上传完成后再将小块合并。

 

上传:

        基于秒传实现分片上传,可以先将文件进行分片并计算出每个分片的MD5值,然后将这些分片和MD5值上传到服务器中存储起来。

        服务器在接收到分片和MD5值后,可以根据MD5值查找Redis中是否已经存在相同的文件。

  • 如果存在,则返回该文件的唯一标识符。对于已上传的分片,服务器将其保存到临时文件夹中,同时记录下该分片的位置信息,这就实现了文件片秒传
  • 如果不存在,则根据分片的MD5值判断哪些分片已经上传,哪些分片还需要继续上传。对于未上传的分片,服务器返回需要继续上传的分片索引,客户端根据索引上传相应的分片数据。

        当所有分片都上传完成后,服务器将所有分片进行合并,并生成一个唯一的文件标识符,将该标识符和文件信息存储到Redis中。

下载:

        客户端通过文件标识符下载文件时,服务器根据标识符从Redis中获取文件信息,再根据分片位置信息将文件分片进行合并,并返回给客户端。


🍢MD5存储位置

1、持久化到数据库中

  • 优点:方便查找和比较,数据库中的数据不会丢失。
  • 缺点:需要在数据库中创建表以存储MD5值,并确保所有相关文件都已添加到数据库中。

2、存储到redis中

  • 优点:查找速度快,减少网络时延。
  • 缺点:redis的数据存在内存中,数据有丢失的风险,可以设置在开启服务器时自动去数据库取出数据存到redis中。redis存储有限,过多的数据会无法存储,需要综合考量。

 

🎋总结

        文件秒传的优点在于,对于同一份文件,无论是上传者还是下载者,都可以利用已有的文件块或者整个文件的信息进行操作,不需要重复传输数据,节省了时间和网络资源。这种技术不仅提高了文件上传的效率,也为用户节省了成本,减少了网络带宽的消耗。

        文件秒传也同样存在缺点,首先是安全性问题,如果黑客可以伪造MD5值,则可能存在安全性问题。另外,如果服务器已经存在相同的文件,但是该文件已经损坏或者不完整,秒传可能会导致上传的文件也是不完整的。如果我们选择依赖redis,当Redis出现问题,可能导致秒传失败或者数据丢失。

        总的来说,文件秒传可以带来很多好处,但也存在一些安全性和数据完整性方面的问题需要注意。需要在实现时进行充分的测试和验证,并采取适当的措施保障数据安全和完整性。

        关于文件上传下载设计到的知识点,打算做一个系列进行分享,大家多多评论,感谢阅读!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/473181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Afkayas.1(★)

软件运行 要输入正确的Name和Serial 查壳 一个VB程序,没有加壳 载入OD 直接开搜索字符串。 这里看到了错误的提示,“You Get It”应该就是成功的字符串了。 前面的“AKA-”应该是在什么时候拼接的字符串 去成功的字符串附近看看 这个字符串上面…

LVS负载均衡群集——DR模式

一、LVS-DR集群介绍 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用&#xff0…

第九章 子查询

文章目录 前言一、.需求分析与问题解决1 、实际问题2 、子查询的基本使用3 、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、 HAVING 中的子查询4、CASE中的子查询5、 子查询中的空值问题6、非法使用子查询 三、多行子查询1、 多行比较操作符2、代码示例3 、空值…

客快物流大数据项目(一百一十八):配置中心 Spring Cloud Config

文章目录 配置中心 Spring Cloud Config 一、​​​​​​​Config 简介

STM32-HAL-SPI-W25Q128FV简单读写测试(2)

文章目录 一、Flash的基本读写操作1.1 向芯片中的某个地址(addr:0x02)连续写入不定长的数据并读取代码示例读写流程分析函数分析 1.2 向芯片中的某个地址(addr:0x00)写入一个数值代码示例:读写流程分析 具体的配置接上…

react native ios 添加启动页 xcode14

最近更新xcode,有些配置有些不同,网上查的方法都是过时的,导致配了一段时间卡在这里,最后访问官网才弄好了,所以以后解决问题的办法先看官网再查其他各路神仙的办法。 官网的步骤:https://github.com/crazy…

MAC 查看已装载的卷宗

查看卷宗目录命令 ls /Volumes网络卷宗:本机、系统报告。 参考资料:https://blog.csdn.net/qq_41731201/article/details/125407204

建筑行业如何进行高效管理文件?

建筑设计行业在日常办公中会产出大量文件,如设计图纸协作商议,项目资料等,建筑行业该如何高效管理文件呢? 建筑设计行业团队可能遇到的文件管理问题: 1,设计图纸一般较大,来回传输不仅麻烦&…

【矩阵快速幂 | 斐波那契数列 | 矩阵加速】

文章目录 基础知识1. 矩阵结构2. 重载 * 运算符3. 矩阵快速幂 例题1: 矩阵幂求和例题2: 矩阵快速幂例题3: 斐波那契数列例题4: 矩阵加速例题5: 广义斐波那契例题6: 斐波那契公约数例题7: 这个勇…

设计模式——设计模式介绍和单例设计模式

目录 一、设计模式概述和分类 1.1 设计模式介绍 1.2 设计模式分类 二、创建型设计模式-单例模式 2.1 介绍 2.2 八种单例模式的创建方式 2.2.1 饿汉式(静态常量) 2.2.2 饿汉式(静态代码块) 2.2.3 懒汉式(线程…

TCP/IP协议基础

1.TCP/IP模型的分层 网络接口层(Network Interface Layer):(数据链路层) 功能: ①将数据帧发送到物理网络,并从物理网络接收数据帧。 ②处理硬件地址,如MAC地址。 主要协议&#xff…

[独家]自动播放K线图训练盘感能力!股票量化分析工具QTYX-V2.3.5

K线量价的重要性 K线图对炒股的朋友来说太熟悉不过了,每一根K线包含了开盘价、收盘价、最高价和最低价这四个价位信息,分别用红和绿两种颜色来表示上涨或下跌,反映了单位时间周期内价格变动的情况。 不过K线的功效可不仅仅用来记录价格的变动…

Linux信号:信号 信号集 信号集函数

1. 信号的概念 Linux进程间通信的方式之一。信号也称为“软件中断”。 信号特点: 简单;携带信息有限;满足特定条件才发送信号;可进行用户空间和内核空间进程的交互; 信号4要素: (1&#xf…

根据Java的TreeMap源码的原理编写C++红黑树删除操作

(一)了解二叉搜索树的删除操作 删除操作总结: ******普通结点删除:******* ①删除叶结点 ②删除只有1个子结点的结点 >>如果被删除结点的左子树为空,则令其右子树子承父业代替其位置即可 >>如果被删除结点…

JPA整合达梦数据库

陈老老老板🦸 👨‍💻本文专栏:国产数据库-达梦数据库(主要讲一些达梦数据库相关的内容) 👨‍💻本文简述:本文讲一下SpringBoot整合JPA与达梦数据库,就是简单&…

《算法工程师带你去》读书笔记

什么是稀疏向量(向量的稀疏表示) 对数据进行预处理时,一般需要对类别型特征进行编码: 序号编码独热编码 二进制编码 其中独热编码用的是最多的。但是当类别数十分巨大时,独热编码是一个非常稀疏的向量,只有…

IDEA(八)常用插件推荐

目录 1.GitHub Copilot2.MyBatisCodeHelperPro3.Maven Helper4.Translation5.Api Savior6.Alibaba Java Coding Guidelines7.Sequence Diagram8.Key Promoter X9.Restfultoolkit-fix 在IDEA中,Ctrl Alt S 选择 Plugins,可以添加很多帮助我们开发的插件…

Arduino串口提取数字(整型和浮点型)

数据提取 文章目录 数据提取前言一、提取整型数据二、提取浮点型数据 前言 之前需要用32和ESP进行通信上传数据,一直都用的都是数据上传然后处理成整型数据,今天需要处理成浮点型数据所以就查了一下,于是就记录一下。 一、提取整型数据 #i…

〖Python网络爬虫实战⑳〗- 数据存储之CSV操作实战

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

JDBC数据库连接技术学习笔记

1. 概述 本笔记是学习尚硅谷教育的23版jdbc的课后笔记 1.1 JDBC概念和理解 1. jdbc是(Java Database Connectivity)单词的缩写,翻译为java连接数据库 2. jdbc是java程序连接数据库的技术统称 3. jdbc由java语言的规范(接口)和各个数据库厂商的实现驱动(jar)组成 4. jdbc是一…