php保存任何文件的文本是否工作不正常?

php保存任何文件的文本是否工作不正常?,php,sql,file,pdf,text,Php,Sql,File,Pdf,Text,我想创建文件共享平台,但php有一些缺陷。我只需使用fread获取任何文件的文本(exe、pdf、docx、ppt等),然后我创建具有随机名称和.txt扩展名的文本文件。因此,当用户想要下载此文件时,我创建了一个随机文件夹,在这个文件夹中我创建了一个和用户想要下载的文本相同的文件,然后我给出了和用户上传的文件版本相同的扩展名,并强制用户下载它。 但当用户下载文件时,例如zip文件,然后如果用户想要打开,它会说无法打开,因为不支持格式。当我尝试使用docx、pdf、zips等文件(不是txt、ht

我想创建文件共享平台,但php有一些缺陷。我只需使用fread获取任何文件的文本
(exe、pdf、docx、ppt等)
,然后我创建具有随机名称和
.txt
扩展名的文本文件。因此,当用户想要下载此文件时,我创建了一个随机文件夹,在这个文件夹中我创建了一个和用户想要下载的文本相同的文件,然后我给出了和用户上传的文件版本相同的扩展名,并强制用户下载它。 但当用户下载文件时,例如zip文件,然后如果用户想要打开,它会说无法打开,因为不支持格式。当我尝试使用docx、pdf、zips等文件(不是txt、html、css、c文件)时,就会出现这种情况

示例:我强制用户下载与他上载的扩展名相同的文件,例如,如果用户上载了zip文件,我使用fread读取文本,然后将此文本保存在db或文本文件中,然后如果用户想要下载该文件,我只需创建文件并为其提供zip扩展名,然后强制用户下载,但一旦用户上传这个文件,如果用户想打开它就会失败,但它应该打开zip文件,因为这个文件的内容文本和用户上传到服务器的内容完全相同

答复应包括:

1) 为什么会发生这种情况?如何修复

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

3) 这样做安全吗

  • 这种情况会发生,因为windows知道应用程序仅从扩展名打开文件。如果将文件重命名为something.txt,则编辑器总是希望打开它

  • 没有理想的解决方案。一种解决方案是将原始名称的文件(可能在某些唯一部分以防止重复)存储在非公共可读目录中,而不设置执行位。要访问该文件,可以创建一个代理脚本,该脚本返回该文件并显示一个应下载头(可能还有原始文件名)

  • 它和你实施它一样安全。您当前的解决方案可能是安全的,我发布的解决方案可能是安全的-但不知道细节,不知道您是如何实现它的,没有人知道它是否真的安全

  • 之所以会发生这种情况,是因为您正在打开类似zip文件的二进制文件,并将其存储在文本文件中,然后再次使用zip扩展名对其进行流式处理

  • 理想的解决方案是使用100万开放源码文件管理器中的一个,该管理器拥有经验证的记录和大型开发人员社区。但是,如果出于某种原因,您希望构建自己的文件,请将文件保存在公用文件夹外的安全文件夹中。将路径与将向用户显示的公共路径一起存储在所选数据库中。根据请求,使用公共路径映射到私有路径,并自己开始下载

  • 安全性与您所做的一样,但没有什么是100%安全的,因此,如果您要存储敏感数据,请使用经过良好构建和记录的内容


  • 很好的是,当这个问题一开始就没有意义时,你就为答案设定了标准,为什么要考虑可执行文件或包含二进制文件或文本的文件呢?你不能创建一个zip文件并将上传的文件添加到那里吗?@Mr.Phoenix谢谢。是的,我可以这样做,但我需要能够读取这些文件,因为我会向用户显示此文件的内容,可以使用不同的方式,例如,如果它是pdf,当我完成pdf阅读器时,它将是可读的,当它是zip时,它不会有预览,这可能类似于dropbox。例如,如果我将zip上传到dropbox,然后如果我将其重命名为txt文件,它会显示文本内容,我想我可以用这种方式存储任何文件,这样当我的阅读器准备好后,我就可以在将来使用每种格式。但问题没有发生。我实际上没有强迫用户下载与他上载的相同扩展名,例如,如果用户上载zip文件,我用fread读取文本,然后将此文本保存在db或文本文件中,然后,如果用户想要下载该文件,我只需创建文件并为其提供zip扩展名,然后强制用户下载,但一旦用户上传该文件,如果用户想要打开该文件,则会失败,但它应该打开zip文件,因为该文件的内容文本与用户上传到服务器的内容完全相同,您可以确定,您对编码没有问题,或者数据库字段不太小,无法保存所有内容?即使确保此文件包含的内容与上载的版本相同,我也更改了real file(将上载)的扩展名,然后复制文本并将其粘贴到下载的版本,然后更改两者的extesion,real file工作正常,下载再次失败我有一些编码问题,我将就此提出另一个问题,但似乎还有另一个问题,因为我复制了旧文件文本并将其粘贴到下载的文件中,它再次失败谢谢你的回答,无法读取二进制文件的文本内容吗?它是二进制文件。当您使用文本编辑器打开它时,您将看到编辑器对文件的解释。您可以将其内容保存到纯文本文件中,但如果存在编码问题,则很可能会破坏它。为什么不简单地将blob对象存储在数据库中,或者将文件存储在文件系统中更安全的地方?