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

相关文章

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

java反序列化serialVersionUID不一致问题及解决

《java反序列化serialVersionUID不一致问题及解决》文章主要讨论了在Java中序列化和反序列化过程中遇到的问题,特别是当实体类的`serialVersionUID`发生变化或未设置时,... 目录前言一、序列化、反序列化二、解决方法总结前言serialVersionUID变化后,反序列化失

java对接Pinata上传文件到IPFS全过程

《java对接Pinata上传文件到IPFS全过程》本文详细介绍了如何使用PinataAPI将文件上传到IPFS网络,首先登录Pinata官网并生成JWT令牌,然后在项目中导入OkHttp依赖并编写代... 目录1.登录2.生成令牌3.导入依赖4.编写代码5.调用接口调试China编程代码总结Pinata调用AP

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

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

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

python中Hash使用场景分析

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