2012-09-19 70 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

喜原型斯塔克, 很抱歉,但我沒有得到你所暗示的 - 請詳細說明! –

相關問題