formidable上传文件hash不一致

2024-04-28 14:44
文章标签 上传 一致 hash formidable

本文主要是介绍formidable上传文件hash不一致,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.什么是formidable

formidable是什么?搜一搜大家就知道了,node的form表单上传模块,尤其是处理文件上传。
以下是npm中的优势介绍:

  • Fast (~900-2500 mb/sec) & streaming multipart parser
  • Automatically writing file uploads to disk (optional, see options.fileWriteStreamHandler)
  • Plugins API - allowing custom parsers and plugins
  • Low memory footprint
  • Graceful error handling
  • Very high test coverage

中文:

  • 快速(~900-2500 mb/秒)和流式多部分解析器
  • 自动将文件上传写入磁盘(可选,请参阅 options.fileWriteStreamHandler)
  • 插件 API - 允许自定义解析器和插件
  • 内存占用低
  • 优雅的错误处理
  • 非常高的测试覆盖率

所以:
高写入、低占用、支持GB级上传数据处理,是它被使用的理由。

想具体理解的话,可以移步npm官方地址介绍
npm地址:https://www.npmjs.com/package/formidable

2.问题情景及原因追溯

具体如何使用这个模块,相信大家都能找到。那么,我来说一下,遇到的一个问题。

需求如下:

有一个需求,上传的压缩文件,如果有相同的,则不允许重复上传,如果有改动,则可以更新上传。

问题场景:

之前开发者自测时传过的压缩包,测试没问题,然后发给了产品经理,产品经理手闲,不小心上传到了测试环境,发现,依旧可以上传。所以产品经理有疑问,是不是发给他的不是最新的压缩包?

问题查询:

怎么回事?明明没有修改,为什么能重复上传呢?我陷入了怀疑?难道真的不是最新版?使用的对比工具,发现,并没有修改,就是最新的包,那么?问题在哪里呢?
我去查了formidable对hash的计算逻辑,发现,逻辑是:

crypto.createHash("sha1").update(buffer).digest('hex')

所以:压缩包的buffer不一致。

压缩包文件不一致?一样啊?那么,哪里的问题勒?
会不会是产品经理传成旧版本了?(程序员:我本地没问题啊!)
看了一遍产品经理的操作,发现,不对啊,你的文件名称跟我的不一样?

仔细一看,我通过钉钉给他发了多次,所以导致,我本地压缩包名称是:test1.zip,他下载到本地的压缩包是test1(5).zip

所以,结论来了。

问题结论:

结论1.压缩包的文件名称修改了
结论2.在他下载后,他的压缩包的创建时间、修改时间是他下载的时间

所以,压缩包的元数据变了,导致,formidable在验证文件信息的时候,hash值不一致,所以,显示不同文件,允许更新。

总结:

formidable的文件hash生成是基于文件的所有信息进行的。即使文件内容相同,文件的元数据(例如修改时间)发生变化也会导致生成的哈希值不同。
哈希算法通常是对输入数据进行处理生成固定长度的输出,如果输入数据有任何变化,哪怕是一点点,生成的哈希值也会完全不同。因此,如果你在同一天内使用相同的文件来生成哈希值,结果是相同的,因为文件内容相同,但在不同的日期,可能是文件元数据的变化导致了不同的哈希值。

之前也有其他开发遇到过这个问题,都以偶现,无法复现,不予解决处理。
但是其实,仔细追溯一下,并不是无迹可寻,用心,再用些技巧,怎么不能解决呢?

出现了,就会有痕迹。你找不到,是你没认真!

这篇关于formidable上传文件hash不一致的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943514

相关文章

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

GitLab文件的上传与下载方式

《GitLab文件的上传与下载方式》:本文主要介绍GitLab文件的上传与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录GitLab 项目拉取到本地GitLab 项目上传方法方法 1:本地项目未初始化Git方法 2:本地项目已初始化GitGitLab 上

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

Java实现MinIO文件上传的加解密操作

《Java实现MinIO文件上传的加解密操作》在云存储场景中,数据安全是核心需求之一,MinIO作为高性能对象存储服务,支持通过客户端加密(CSE)在数据上传前完成加密,下面我们来看看如何通过Java... 目录一、背景与需求二、技术选型与原理1. 加密方案对比2. 核心算法选择三、完整代码实现1. 加密上

在React聊天应用中实现图片上传功能

《在React聊天应用中实现图片上传功能》在现代聊天应用中,除了文字和表情,图片分享也是一个重要的功能,本文将详细介绍如何在基于React的聊天应用中实现图片上传和预览功能,感兴趣的小伙伴跟着小编一起... 目录技术栈实现步骤1. 消息组件改造2. 图片预览组件3. 聊天输入组件改造功能特点使用说明注意事项

springboot上传zip包并解压至服务器nginx目录方式

《springboot上传zip包并解压至服务器nginx目录方式》:本文主要介绍springboot上传zip包并解压至服务器nginx目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录springboot上传zip包并解压至服务器nginx目录1.首先需要引入zip相关jar包2.然

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例