JAVA:文件防重设计指南

1、简述

在现代应用程序中,处理文件上传是一个常见的需求。为了保证文件存储的高效性和一致性,避免重复存储相同的文件是一个重要的优化点。本文将介绍一种基于哈希值的文件防重设计,并详细列出实现步骤。
在这里插入图片描述

2、设计原理

文件防重的基本思路是通过计算文件的哈希值(如 MD5、SHA-1 等)来唯一标识文件内容。当上传文件时,首先计算其哈希值,然后检查该哈希值是否已经存在。如果存在,则认为文件重复,不进行存储;否则,将文件存储并记录其哈希值。

3、实现步骤

3.1 准备工作

首先,确保您的开发环境中包含以下依赖:

  • Java SDK
  • Spring Boot(用于构建 RESTful API)
  • Apache Commons IO(用于处理文件操作)

在 pom.xml 中添加以下依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version></dependency>
</dependencies>
3.2 计算文件哈希值

使用 Apache Commons IO 和 Java 标准库计算文件的哈希值:

import org.apache.commons.io.IOUtils;import java.io.InputStream;
import java.security.MessageDigest;public class FileHashUtil {public static String calculateHash(InputStream inputStream, String algorithm) throws Exception {MessageDigest digest = MessageDigest.getInstance(algorithm);byte[] byteArray = IOUtils.toByteArray(inputStream);byte[] hashBytes = digest.digest(byteArray);StringBuilder sb = new StringBuilder();for (byte b : hashBytes) {sb.append(String.format("%02x", b));}return sb.toString();}
}
3.3 文件防重服务

创建一个服务类,包含文件存储和哈希值检查逻辑:

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.ConcurrentHashMap;@Service
public class FileService {private static final String STORAGE_DIR = "/path/to/storage";private ConcurrentHashMap<String, String> fileHashStore = new ConcurrentHashMap<>();public String uploadFile(MultipartFile file) throws Exception {InputStream inputStream = file.getInputStream();String hash = FileHashUtil.calculateHash(inputStream, "MD5");if (fileHashStore.containsKey(hash)) {return "File already exists with hash: " + hash;}File storageFile = new File(STORAGE_DIR, file.getOriginalFilename());try (FileOutputStream outputStream = new FileOutputStream(storageFile)) {outputStream.write(file.getBytes());}fileHashStore.put(hash, storageFile.getAbsolutePath());return "File uploaded successfully with hash: " + hash;}public boolean isFileDuplicate(MultipartFile file) throws Exception {InputStream inputStream = file.getInputStream();String hash = FileHashUtil.calculateHash(inputStream, "MD5");return fileHashStore.containsKey(hash);}
}
3.4 RESTful API 控制器

创建一个控制器类,提供文件上传的 REST 接口:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
@RequestMapping("/api/files")
public class FileController {@Autowiredprivate FileService fileService;@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {try {String response = fileService.uploadFile(file);return ResponseEntity.ok(response);} catch (Exception e) {return ResponseEntity.status(500).body("File upload failed: " + e.getMessage());}}@PostMapping("/check")public ResponseEntity<Boolean> checkFileDuplicate(@RequestParam("file") MultipartFile file) {try {boolean isDuplicate = fileService.isFileDuplicate(file);return ResponseEntity.ok(isDuplicate);} catch (Exception e) {return ResponseEntity.status(500).body(false);}}
}
3.5 运行和测试

启动 Spring Boot 应用,并使用工具(如 Postman)测试文件上传接口。

  • 文件上传:
    POST 请求到 /api/files/upload,上传文件。
    如果文件存在,则返回文件已存在的信息。
    如果文件不存在,则存储文件并返回成功信息。
  • 文件重复检查:
    POST 请求到 /api/files/check,上传文件。
    返回文件是否重复的布尔值。
  • 额外优化
    存储优化:可以将文件存储路径改为哈希值的一部分,以便更好地组织和查找文件。
    分布式支持:将文件哈希存储在 Redis 等分布式缓存中,以支持多实例环境。
    哈希算法选择:根据文件大小和安全需求选择合适的哈希算法(如 SHA-256)。

4、总结

本文介绍了通过哈希值实现文件防重的设计方案,并详细列出了实现步骤。通过这种方式,可以有效避免重复存储相同文件,提升系统性能和存储效率。希望本文对您有所帮助,并能在实际项目中应用这些优化方法。

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

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

相关文章

Dns被莫名篡改的逆向分析定位(笔记)

引言&#xff1a;最近发现用户的多台机器上出现了Dns被莫名修改的问题&#xff0c;从系统事件上看并未能正常确定到是那个具体软件所为&#xff0c;现在的需求就是确定和定位哪个软件具体所为。 解决思路&#xff1a; 首先到IPv4设置页面对Dns进行设置&#xff1a;通过ProcExp…

setjmp和longjmp函数使用

这里用最简单直接的描述&#xff1a;这两组函数是用于实现类似vscode全局的标签跳转功能&#xff0c;setjmp负责埋下标签&#xff0c;longjmp负责标签跳转。 #include <stdio.h> #include <stdlib.h> #include <setjmp.h>jmp_buf envbuf1; jmp_buf envbuf2;…

HttpServer内存马

HttpServer内存马 基础知识 一些基础的方法和类 HttpServer&#xff1a;HttpServer主要是通过带参的create方法来创建&#xff0c;第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型&#xff0c;表示允许排队的最大TCP连接数&#xff0c;如果该值小…

JAVA每日作业day7.4

ok了家人们今天学习了Date类和simpleDateformat类&#xff0c;话不多说我们一起看看吧 一.Date类 类 java.util.Date 表示特定的瞬间 ( 日期和时间 ) &#xff0c;精确到毫秒。 1.2 Date类的构造方法 public Date(): 用来创建当前系统时间对应的日期对象。 public Date(long …

【java开发环境】多版本jdk 自由切换window和linux

win10 一、准备 各种版本的jdk&#xff0c;按自己的需要下载。 我这里是需要jdk17和jdk8。 1、jdk17 下载&#xff1a;Java Downloads | Oracle&#xff0c;选择exe后缀文件 2、jdk8下 载&#xff1a;Java Downloads | Oracle&#xff0c;选择exe后缀文件 二、详细步骤 1、…

Linux线程:编织并发的梦幻世界

目录 &#x1f6a9;引言 &#x1f6a9;听故事&#xff0c;引概念 &#x1f6a9;生产者消费者模型 &#x1f680;再次理解生产消费模型 &#x1f680;挖掘特点 &#x1f6a9;条件变量 &#x1f680;条件变量常用接口 &#x1f680;条件变量的原理 &#x1f6a9;引言 上一篇…

打卡第2天----数组双指针,滑动窗口

今天是参与训练营第二天&#xff0c;这几道题我都看懂了&#xff0c;自己也能写出来了&#xff0c;实现思路很重要&#xff0c;万事开头难&#xff0c;希望我可以坚持下去。希望最后的结果是量变带来质变。 一、理解双指针思想 leetcode编号&#xff1a;977 不止是在卡尔这里…

一篇文章说清楚Filter(过滤器)、Interceptor(拦截器)和AOP(切面儿)

文章目录 前言一、Filter&#xff08;过滤器&#xff09;1.说明2.实现filterChain.doFilter() 3.order优先级4.解决跨域5.拦截返回错误信息JSON 二、Interceptor&#xff08;拦截器&#xff09;1.说明2.实现preHandlepostHandleafterCompletion 3.执行顺序图4.排除特定路径拦截…

论文学习——基于类型检测的动态自适应多目标优化算法

论文题目&#xff1a;Dynamic adaptive multi-objective optimization algorithm based on type detection 基于类型检测的动态自适应多目标优化算法&#xff08;Xingjuan Cai a,b, Linjie Wu a,∗, Tianhao Zhao a, Di Wu c, Wensheng Zhang d, Jinjun Chen e&#xff09;Inf…

yum命令提示 错误:rpmdb: BDB0113 Thread/process 4153/139708200269632

一、报错信息 [rootDawn yum.repos.d]# yum clean all 错误&#xff1a;rpmdb: BDB0113 Thread/process 4153/139708200269632 failed: BDB1507 Thread died in Berkeley DB library 错误&#xff1a;db5 错误(-30973) 来自 dbenv->failchk&#xff1a;BDB0087 DB_RUNRECOVE…

HTTP与HTTPS协议区别及应用场景

HTTP&#xff08;超文本传输​​协议&#xff09;和 HTTPS&#xff08;安全超文本传输​​协议&#xff09;都是用于通过网络传输数据的协议。虽然它们有一些相似之处&#xff0c;但在安全性和数据保护方面也存在显著差异。 在这篇博文中&#xff0c;我们将探讨 HTTP 和 HTTPS…

pytorch中的contiguous()

官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为&#xff1a; Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…

自然语言处理与Transformer模型:革新语言理解的新时代

引言 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算机科学的一个重要分支&#xff0c;旨在使计算机能够理解、生成和处理人类语言。随着互联网和数字化信息的爆炸性增长&#xff0c;NLP在许多领域中的应用变得越来越重要&#xff0c;包括&#xff1a; 搜索引擎&am…

Python实现PowerPoint演示文稿到图片的批量转换

PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具&#xff0c;被广泛应用于教育、商务汇报及个人项目展示等领域。 然而&#xff0c;面对不同的分享场景与接收者需求&#xff0c;有时需要我们将PPT内容以图片形式保存与传播。这样能够避免软件兼容性的限制&…

OpenEuler 22.03 LTS SP3 CVE-2024-6387 OpenSSH 漏洞修复指南

一、漏洞概括 漏洞名称OpenSSH Server远程代码执行漏洞漏洞编号CVE-2024-6387公开时间2024-7-1CVSS 3.1分数8.1威胁类型代码执行漏洞等级暂无技术细节状态已公开在野利用状态不明确PoC状态x86已公开EXP状态未公开 OpenSSH是SSH&#xff08;Secure Shell&#xff09;协议的开源…

腾讯课堂即将停止服务?来试试这款开源的知识付费系统

项目介绍 本系统基于ThinkPhp5.0layuiVue开发,功能包含在线直播、付费视频、付费音频、付费阅读、会员系统、分销系统、拼团活动、直播带货、直播打赏、商城系统等。能够快速积累客户、会员数据分析、智能转化客户、有效提高销售、吸引流量、网络营销、品牌推广的一款应用&…

【Git 学习笔记】gitk 命令与 git log 其他参数的使用

1.7 用 gitk 查看提交历史 # make sure you have gitk installed $ which gitk /usr/bin/gitk # Sync the commit ID $ git checkout master && git reset --hard 13dcad # bring up the gitk interface, --all to see everything $ gitk --all &实测结果&#xf…

速速来get新妙招!苹果手机护眼模式在哪里开启

在日常生活中&#xff0c;我们经常长时间使用手机&#xff0c;无论是工作还是娱乐&#xff0c;屏幕的蓝光都会对眼睛造成一定的伤害。为了减轻眼睛疲劳&#xff0c;苹果手机推出了护眼模式&#xff0c;也叫“夜览”模式&#xff0c;通过调整屏幕色温&#xff0c;让显示效果更温…

MySQL 8.0 架构 之 中继日志(Relay log)

文章目录 MySQL 8.0 架构 之 中继日志&#xff08;Relay log&#xff09;中继日志&#xff08;Relay log&#xff09;概述相关参数参考 【声明】文章仅供学习交流&#xff0c;观点代表个人&#xff0c;与任何公司无关。 来源|WaltSQL和数据库技术(ID:SQLplusDB) MySQL 8.0 OCP …

PyTorch - 神经网络基础

神经网络的主要原理包括一组基本元素&#xff0c;即人工神经元或感知器。它包括几个基本输入&#xff0c;例如 x1、x2… xn &#xff0c;如果总和大于激活电位&#xff0c;则会产生二进制输出。 样本神经元的示意图如下所述。 产生的输出可以被认为是具有激活电位或偏差的加权…