2017-08-06 34 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; 
    } 
相关问题