我正在尝试为我的java应用添加云功能。我需要同步客户端和服务器中的文件。我是java编程的新手,我想听听在这种情况下可用的最佳选项。
我尝试了一些像
这样的示例项目http://jfilesync.sourceforge.net/
http://sourceforge.net/p/lazysync
https://github.com/quaa/JavaFileSync
但我在服务器部分真的很困惑。实际上会有很多用户帐户,所以我希望我需要创建不同的文件夹来存储不同用户的数据。那么实现这一目标的最佳方法是什么? 创建ftp连接? 还是http上传?
我不确定。任何人请指导我走正确的道路。
答案 0 :(得分:0)
这实际上在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兆字节的功率点演示。
答案 1 :(得分:0)
最简单的方法是在Dropbox上创建一个帐户,该帐户将为您提供一个公共文件夹。该文件夹可以公开使用,或者任何用户都可以访问,无需任何帐户或登录密码。所以该文件夹成为您的服务器站点或ftp,您不需要服务器代码。现在公用文件夹链接成为您的服务器URL,端口将为80.只需为dropbox公用文件夹上的每个用户实现客户端创建单独的文件夹,这将帮助您为每个用户创建不同的URL。对于他们自己的数据同步。