文件上传版本控制问题的思路

1.web端上传文件A到服务器
2.从服务器下载文件A到本地
3.本地修改完文件A再次上传到服务器,服务器验证该文件是否是文件A,并且是否已经修改过

请问这种问题的解决思路是什么呢?求大神给个思路~

==========分割线==========

我走过的一些弯路:
我的思路是给每个上传的文件添加一个自定义文件属性fileId,然后通过该id来判断是否是同一个文件,再通过md5来判断是否已经修改过。具体的实现方式有如下:
1.用js来判断
我试图在客户端用js读取文件的自定义属性,将属性作为表单一部分提交到服务器进行验证,但是发现并不可行,因为js无法读取文件的自定义属性
2.服务器端验证
先把文件上传到服务器,在服务器端读取文件的自定义属性,再进行进一步的验证。但是发现,网页端上传的文件post到服务器端后,是以流的形式读取与保存的,将流保存为文件的时候,它只读取了流中的文件主体内容,而无法读取流中的文件属性(这里我还抱有怀疑,如果不对欢迎指出),所以也无法实现

我使用的文件属性读写工具:
DSOFile,点击查看

阅读 4.2k
4 个回答

肯定是没有弄清楚需求。提需求的人根本不了解技术细节吧,他就随便一举例“一定要确保文件就是原来那个文件修改来的”,实际上文件为何非要限定从这里下载的呢?只要给你的文件符合你的要求就行了,你管它哪里来的。
我建议你重新确认需求。

另外你的文件是什么文件?改写工具是什么?
如果是无格式文本文件,基本不可能识别出来我怎么修改这文件的,是重写的还是修改的。

如果是有格式可以添加一些注释 而又约定必须保留这些内容的情况下,你可以往里面加令牌吧。 下载的时候我塞进个令牌,上传来的时候我检查令牌就行了。二进制文件和专用修改工具就可以根据设计保留这个。如果是文本文件,那令牌也就明白着写在人看得见的地方,他删还是改还是保留令牌文本,就靠人的执行力了。


像你这需求,我的看法就是它是无意义的。你要是真想确保必须是原文件改来的,你直接提供网页 在网页上通过服务器修改内容就行了,何必要下载修改再上传呢。 你既允许我修改 又要检查是不是那个文件,那怎么可能? 我作为人告诉你这就是你那个文件,你这机器就得认,完全一致说明我没修改,不一致说明我改了,我就是完全把它改成别的内容(或是就是给你了个别的文件),我说这是那个文件,你机器还想反抗不成。 一句话,重新确认需求,最好的实现就是通过网页和服务器修改,不让下载修改再上传。

上传文件时,浏览器并不发送文件的meta信息,作为服务器,可以接收到文件名,mime-type,文件内容。

判断文件是否修改过,只判断内容是否修改过吧?数据库可以存原文件内容的md5,如果文件再次上传,检查内容的md5就好。

计算md5值,这是在设计文件传输中最常用的方法

文件从哪儿下载的, 要求文件从哪儿上传(此时为更新, 增加版本号), 否则就是一个新文件.

举例如下:

  1. 有数据表: file(hash, version), file_meta(hash, k, v)
  2. 如果新上传一个文件, 那在file表增加一条记录, 记录版本为1, 在file_meta里面按kv格式把文件名, 大小, 之类的想记录的信息记录下来, 然后把这个文件改个名, 改成 hash_version.ext 这种格式, 保存起来
  3. 如果是修改以后上传, 那么要求到表示hash这个文件的页面里面上传, 这时更新file表的version, 继续添加信息到file_meta表, 把文件改名为 hash_version.ext 格式, 保存起来.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题