2017-08-06 8 views
1

Ich muss Datei hochladen und muss diese Datei als Chunks in Cloud-Speicher schreiben.So erstellen Sie Chunks aus einem Stream in Servlet beim Hochladen von Datei über JSP

  • Im Folgenden finden Sie Upload-Datei Code in JSP:

    <form action="/myservlet" method="post" enctype="multipart/form-data"> 
        <input type="file" name="file" title="File"/> 
        <input type="submit" value="Submit"/> 
    </form> 
    
  • Abrufen der Stream-Datei in Servlets hochzuladen ist wie folgt:

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

Ich habe kleine erstellen Chunks im Servlet und müssen diese direkt in den Cloud-Speicher hochladen. Hier habe ich keinen Zugriff auf den lokalen Dateispeicher, da meine Anwendung in AppEngine ausgeführt wird.

Gibt es eine Möglichkeit, Blöcke aus dem obigen Eingangsstrom beim Lesen zu erstellen?

Antwort

0

Lesen Sie Stücke der gewünschten Länge aus dem Strom. Halten Sie zu lesen, bis es keine mehr Bytes verfügbar sind:

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);   
} 

Hier IOUtils.read ist eine Nutzenfunktion von commons-io, die so viele Bytes wie möglich liest und gibt die tatsächliche Länge lesen (was weniger sein kann als angefordert, wenn EOF erreicht wurde)

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; 
    } 
Verwandte Themen