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

相关文章

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 进行图片上传处理图片上传请求完整代码示例

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Java文件上传的多种实现方式

《Java文件上传的多种实现方式》文章主要介绍了文件上传接收接口的使用方法,包括获取文件信息、创建文件夹、保存文件到本地的两种方法,以及如何使用Postman进行接口调用... 目录Java文件上传的多方式1.文件上传接收文件接口2.接口主要内容部分3.postman接口调用总结Java文件上传的多方式1

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小