给定目标的环境当前不可用,因此,我无法尝试,只能依赖分析!
我的目标可以分为以下不同的步骤:
- 使用愚蠢的“上传文件”页面上传巨大文件(高达100GB) - 无法避免这种情况,因为用户想要一个(愚蠢的)前端并且不愿意通过 ftp 传输文件文件等
- 提供上述前端的 Web 应用程序将托管在低端计算机上 - 2GB RAM 和 40GB HDD,并且此 Web 应用程序不会在本地计算机上存储大文件的任何部分,但必须“快速”写入它到高端远程 Linux 机器
对于每一步,我都会强调我的方法、担忧和疑问:
我提到了this这个线程让我很困惑,因为我计划使用 Spring MVC 和上传页面创建一个愚蠢的 Web 应用程序 - 我是否需要进入 HTML5 等,或者一个简单的 Web 应用程序就足够了?
考虑到 2GB RAM,Web 应用程序将获得不到 1GB 的内存。如果代码编写不严格,我担心可能会出现“OutOfMemoryError” - 我必须确保从流中一次读取一小块(例如 10MB)并将其写入远程 Linux 计算机的文件。 假设我在 Controller Servlet 的 doPost(...) 中,我阅读了一些有关如何继续的内容,但感到困惑:
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub InputStream fis = request.getInputStream(); int i = 0; /* Approach - 1 : Plain old byte-by-byte method */ Socket socket = new Socket("192.168.90.20", 22); OutputStream remoteOpStream = socket.getOutputStream(); while ((i = fis.read()) != -1) { remoteOpStream.write(i); } /* clean-up */ /* Approach - 2 : NIO */ ByteBuffer byteBuff = ByteBuffer.allocate(10000);/* read 10MB of data */ ReadableByteChannel rdbyc = Channels.newChannel(request .getInputStream()); File remoteFile = new File("192.168.90.20/Remote_Linux_Folder");/* * Dunno * how * to * create * a * File * on a * remote * Linux * machine */ FileOutputStream remoteFos = new FileOutputStream(remoteFile); FileChannel writableChannel = remoteFos.getChannel(); while (true/* dunno how to loop till all the data is read! */) { rdbyc.read(byteBuff); writableChannel.write(byteBuff); } /* clean-up */ }
我需要某种方法,其中本地计算机上的数据存储最少 - 代码只需从输入流中读取 n 个字节并将其写入远程计算机
我相信 NIO 是正确的选择,但我无法确定我必须如何继续 - 请对此进行指导。
最佳答案
我将实现一个FixedSizeQueue,并将QueueStream中的数据popAll()到另一台计算机。可能有双缓冲,只是为了提供网络/带宽问题的缓冲。
关于java - 使用网络应用程序上传大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500185/