2017-08-06 36 views
1

我必須上傳文件,並且必須將該文件作爲塊寫入雲存儲。如何在通過JSP上傳文件時從Servlet中的流創建塊

  • 下面是JSP上傳文件代碼:

    <form action="/myservlet" method="post" enctype="multipart/form-data"> 
        <input type="file" name="file" title="File"/> 
        <input type="submit" value="Submit"/> 
    </form> 
    
  • 獲得在Servlet的上傳文件的流如下:

    ServletFileUpload upload = new ServletFileUpload(); 
    FileItemIterator iter = upload.getItemIterator(request); 
    FileItemStream imageItem = iter.next(); 
    InputStream inputStream = imageItem.openStream(); 
    

我要創建小在servlet中大塊,並且必須直接將它們上傳到雲存儲。在這裏,我沒有訪問本地文件存儲,因爲我的應用程序正在AppEngine中運行。

有沒有辦法在閱讀時從上面的輸入流創建塊?

回答

0

從流中讀取所需長度的塊。請繼續閱讀,直到沒有更多可用的字節數:

static final int CHUNK_LENGTH = 1000000; 
void readChunks(InputStream input) throws IOException { 

    byte chunk[] = new byte[CHUNK_LENGTH]; 

    int length; 
    do { 
     length = IOUtils.read(input, chunk); 
     if (length>0) { 
      //if the total length is multiple of CHUNK_LENGTH 
      //the last chunk will be empty 
      doSomethingWith(chunk, length); 
     } 
    } while (length==CHUNK_LENGTH);   
} 

這裏IOUtils.readcommons-io的效用函數,它讀取的字節數可能並返回讀取實際長度(可能小於要求的,如果EOF達到)

int read(final InputStream input, final byte[] buffer) throws IOException { 
     int length = buffer.length; 
     int remaining = length; 
     while (remaining > 0) { 
      final int location = length - remaining; 
      final int count = input.read(buffer, location, remaining); 
      if (EOF == count) { // EOF 
       break; 
      } 
      remaining -= count; 
     } 
     return length - remaining; 
    } 
相關問題