2017-04-22 95 views
2

我要创建文件共享平台,但PHP有一些bug有关它。我只是用FREAD得到任何文件(exe,pdf,docx,ppt and etc)然后创建随机名称和.txt extension.So文本文件时,用户要下载此文件的文本,我创建随机文件夹,并在该文件夹内创建具有用户想要下载的相同文本的文件,然后给出与用户上传的文件版本相同的扩展名,并强制用户下载它。 但是,当用户下载文件,例如压缩文件,然后如果用户想打开,它说因为不支持格式打开失败。这发生在我尝试使用docx,pdfs,zips和那种文件(不是txt,html,css,c文件)。php保存任何文件的文本不能正常工作?

例如:我强制用户使用他上传的相同扩展名下载,例如用户上传的zip文件,我用fread读取文本,然后将该文本保存在数据库或文本文件中,然后如果用户想要下载该文件,我只是创建文件,并给它的zip扩展名,然后强制用户下载它,但一旦用户上传这个文件,然后如果用户想打开它失败,但它应该打开zip文件,因为该文件的内容文本是完全一样的用户上传到服务器

回答应该包含以下内容:

1)为什么发生这种情况如何解决此问题?

2)什么是理想的解决方案?

3)是安全的做到这一点?

+0

您所设定的标准答案,当好事这个问题首先是没有意义的,为什么要考虑可执行文件或包含二进制文件的文件?难道你不能创建一个zip文件并在其中添加上传的文件吗? – Gntem

+0

@ Mr.Phoenix谢谢you.yeah我可以做到这一点,但我需要能够阅读这些文件,因为我会向用户显示此文件的内容,它可以用不同的方式,例如,如果它是pdf ,当我完成我的PDF阅读器时,它将是可读的,当它是zip文件时,它不会有预览,这可以类似于dropbox。例如,如果我上传zip到dropbox然后如果我将它重命名为txt文件,它会显示我认为我可以用这种方式存储任何文件,所以当我的阅读器准备就绪时,我可以在将来使用每种格式。但是,这个问题发生了 – Alex

回答

0
  1. 发生这种情况是因为windows知道应用程序只是从扩展中打开文件文件。如果您将文件重命名为something.txt,那么编辑器总是希望将其打开。

  2. 有没有这样的事情作为理想解决方案。解决方法是将文件与原始名称(可能在某些独特的部分以防止重复)存储在非公共可读目录中,而不设置执行位。要访问该文件,您可以创建一个代理脚本,该代理脚本返回该文件并显示应该下载的标题(也可能是原始文件名)。

  3. 它作为安全的,因为你实现它。你目前的解决方案可能是安全的,我发布的解决方案可能是安全的 - 但不知道细节,如何实现它,没有人知道,如果它实际上是安全的。

+0

没有,我实际上强迫用户使用他上传的相同扩展名下载,例如,如果用户上传的zip文件,我用fread读取文本,然后将该文本保存在数据库或文本文件中,然后如果用户想要下载该文件,我只需创建文件并给予zip扩展名,然后强制用户下载它,但一旦用户上传这个文件,然后如果用户想打开它失败,b ut它应该打开zip文件,因为此文件的内容文本与用户上传到服务器的内容文本完全相同 – Alex

+0

而且您确定,您在编码方面没有问题,或者数据库字段不小以保留所有内容? – Philipp

+0

即使为了确保该文件包含与上传版本相同的内容,我更改了实际文件的扩展名(将会上传),然后复制文本并将其粘贴到下载的版本,然后更改两个文件的extesion,真实文件工作,再次下载 – Alex

0
  1. 这是因为您要打开二进制文件就像一个压缩文件,它在一个文本文件存储然后用zip扩展再次流了。

  2. 理想的解决办法是给有记录的,大的开发者社区使用100万个开源的文件管理器中的一个在那里。但如果由于某种原因想要构建自己的文件夹,请将文件保存在公用文件夹外的安全文件夹中。将路径存储在选择的数据库中,并将其显示给用户。根据请求使用公共路径映射到私人路径并自行开始下载。

  3. 当你做了,但没有什么是100%安全的,所以如果你存储敏感数据使用的东西很好地建立和记录是为安全

+0

谢谢你的答案,是不可能读取二进制文件的文本内容? – Alex

+0

这是一个二进制文件。当你用文本编辑器打开它时,你会看到编辑器对文件的解释。您可以将它的内容保存为纯文本文件,但如果您遇到编码问题,最有可能会破坏它。为什么不简单地将blob对象存储在数据库中,或将文件存储在文件系统中更安全的地方? –