这实际上在 Web 应用程序中很常见。由于我没有很多具体的工作,我会给你一些需要考虑的事情和一般性的建议。
如果您“自己动手”,您不想做的就是将上传的字节存储到数据库中。这是可能的,但要做好,尤其是在人们可能上传任意大小的文件的情况下,是非常困难的。之前已经破解了这个坚果,我想说从最高抽象开始。用户可以上传文件并返回带有文件位置的 URL。因此,用户 POST 一个文件并返回一个通常是 201/204 的响应,其中包含新文件的 URL。即使您使用的是套接字,我也会考虑使用基于 HTTP 的方法,这样您就可以将相同的服务推广到多种类型的客户端和平台。但是,您可能可以在套接字中编写一个非常有效的实现。
无论是套接字还是 HTTP 请求,服务器端的以下内容都是相同的。在服务器端,您有一个接口,例如 FileLocator,它接受一个文件 ID 和一个用户。FileSystemFileLocator 实现 FileLocator 并在文件系统上定位文件。棘手的部分是在一个目录中放置的目录或对象不超过 1,000 个左右。一种常见的技术(如果您为每个文件分配一个唯一的编号)是零填充和反转数字,因此您有 12 个数字。每三位数字块成为目录名,后三位为文件名:/123/400/000/000.pdf。要取回漂亮的文件名,您需要在数据库中跟踪位置、原始文件名和一些元数据。
然后你可以实现 S3FileLocator,它使用 S3 来存储文件。MongoFileLocator 将数据存储在 mongo 等中。您将面临的挑战是弄清楚如何确保数据库中的元数据(您可以非常快速地访问)与文件系统或 S3 中的实际情况保持同步.
读取文件时,只读取文件的小块(如 16k)并循环返回给用户,直到完成。如果您一次读取所有文件,您将非常低效地使用内存。例如,在一个项目中,我是一个傻瓜,通过将文件从 SQL Server 表读取到内存中,然后在内存中复制对象以将其写回客户端来实现这一点。该数据库包含 50 兆字节的幻灯片演示文稿。