在Ruby中下载docx文件会丢失其只读属性

时间:2015-07-21 14:46:37

标签: ruby-on-rails ruby

我有一个代码可以使'.docx'文件只读,保存为模型的属性:

attachment.file = File.open(path)
attachment.save!
FileUtils.chmod('ugo=r', attachment.file.path)

它是正常保存的,只读。但是当我下载文件时,它会丢失只读属性,我可以正常编辑该文件。有没有什么办法可以让它在下载后只读它?

谢谢!

3 个答案:

答案 0 :(得分:2)

正如您所建议的,最好的方法是将原始文件更改为很可能不会被用户编辑的格式(例如PDF,可以编辑但是当您想要提供时,它被认为是常态用户查阅和未编辑的文件。)

一旦你的文件离开你的服务器,你必须假设任何人都可以改变它,没有办法强制他们不能胜任,因为他们现在是该文件的所有者。

答案 1 :(得分:2)

你不能。

文件本身只是一团数据。作为"只读标志"由文件系统提供。 Web服务器不传达有关底层文件系统的信息,因此客户端可以在他的机器上拥有任何文件系统 - 即使是那些不支持"只读"总而言之(我不知道,但理论上可行)。

即使假设您能够传输"只读"通过HTTP下载标记,客户端系统的管理员(即大多数时候是客户端)总是可以删除该标志。

您无法阻止用户修改已发送的文件。 转换为PDF无法获得帮助,they can actually be edited too ,虽然比DOCX更省力,更有可能打破格式化。

因此,它根本无法完成。但是,对于您的具体情况,可能会有变通方法。

您可以使用数字签名 Microsoft Office offers this functionality对文件进行签名。如果它被修改,签名将变为无效或被删除(取决于所使用的编辑器)。因此,读者将打开一个文件,无法判断文件是否实际由您编写。

但是,为了确保文件在传输过程中没有被更改,必须检查签名。如果文件内容发生更改,则检查将失败。如果签名被删除,它就不会存在:读者必须知道它应该是。

签名适用于各种格式,不限于MS Office文档。如果愿意,也可以签署PDF。其他格式可能需要单独分发签名。

答案 2 :(得分:1)

您的意思是从网络上获取文件并且它应该是只读的?这是不可能的。

此外没有任何意义,因为用户可以轻松地向其添加读取标志。