2012-09-19 44 views
1

给定目标的环境不是当前可用的,因此,我无法尝试这些东西,只能依靠分析!使用网络应用程序上传大文件

我的目标可以分为以下不同的步骤:

  1. 上传大文件(高达100GB)用一个愚蠢的“上传文件”页 - 没有逃离这是用户希望(愚蠢的)前端,并不愿意FTP文件等
  2. 提供上述前端的Web应用程序将托管在低端机器上 - 2GB RAM和40GB HDD,并且此Web应用程序不会存储在本地机器上的巨大文件的任何部分,但必须“迅速”写入到一个高端的远程Linux机器

对于每一步,我强调我的做法,关注和疑问:

  • 我提到this螺纹,其困惑我,因为我正打算创建一个使用Spring MVC的带有上传一个愚蠢的Web应用程序页面 - 我是否需要进入HTML5等或简单的Web应用程序就足够了?

  • 鉴于2GB内存,Web应用程序将获得小于1GB的内存。恐怕一个“OutOfMemoryError异常”是可能的,如果代码不严格写 - 我必须确保从流,一小块,说10MB必须一次读取和写入远程Linux机器的文件。 假设我在控制器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是去的方式,但我不能确定如何我一定要继续 - 请指导一下。

+0

无论是Sevlet API或标准的java.io.File IO提供无阻塞的API。在大多数O/S平台的文件IO阻塞,但可以与非阻断通道,但实际的IO当您执行它阻止使用(这只是太快,通常发现其中的差别,由于O/S高速缓冲存储器等...)。如果你真的需要一个无阻塞的文件IO的设计外观在AIO(异步I/O模型)不NIO。但是如果您的数据目的地是使用Socket的网络,那么NIO是正确的。 –

回答

0

我会实现一个FixedSizeQueue和popAll()从QueueStream到另一台计算机的数据。可能有双缓冲,只是为了缓解网络/带宽问题。

+0

喜原型斯塔克, 很抱歉,但我没有得到你所暗示的 - 请详细说明! –

相关问题