我将假设您出于此答案的目的使用 Apache。
首先,上传的文件正常吗?您可能遇到问题的一个可能原因是 tmp 目录不可被网络服务器写入,或者无法读取。假设没问题,那么 move_uploaded_file 应该可以正常工作。
在您的 DOCUMENT_ROOT 旁边创建一个文件夹,我们称之为“文件存储”。确保它可由 www-data 或任何运行 apache 的用户写入。现在,您应该能够将文件移动到该文件夹中。请注意,它们通常由 www-data:www-data 拥有 - 或者您的服务器设置为运行的任何用户和组。我将“filestore”文件夹放在 DOCUMENT_ROOT 文件夹旁边的原因是您可以确保网络服务器可以读取到 DOCUMENT_ROOT 的文件路径。否则,您将面临路径不可读的文件夹部分风险,这将阻止您死亡。例如,如果您将 /usr/local/media 作为目标文件夹,并且 /usr/local 不能被网络服务器读取(和可执行),那么您就完蛋了。
如果所有这些都有效,并且您绝对必须在其他地方拥有媒体,那么您可以在任何地方拥有“filestore”文件夹,只要它的整个路径可以被网络服务器读取/执行。检查路径中的每个目录。
如果这些上传的文件是由其他用户通过网络下载的,那么“filestore”文件夹只需要具有 700 的权限,因为它始终是读取它们的网络服务器的用户。如果其他用户需要访问权限,通常是因为以不同用户身份运行的其他软件需要使用它们,那么您可能需要权限为 750 以允许组成员读取(和执行)目录。您还需要将该其他用户添加到 www-data 组。
对于下载,您需要编写一个简单的脚本,在进行一些身份验证检查后将文件转储到浏览器。这样,您可以避免仅通过 http 访问媒体而无需先进行任何身份验证 - 这可能会使您的服务成为非法文件的有吸引力的地方(侵犯版权是这里最不关心的问题)。