"Sicheres Lesen" mit InputStream



  • Nach nunmehr einigen Stunden im Internet bin ich jetzt lediglich noch verwirrter. Der folgende Code funktioniert nicht:

    //! The constructor which expects HttpServletRequest as parameter.
    public IIUploader(HttpServletRequest hsr) throws IIError
    {
      contentType = hsr.getContentType();
      int contentsize = hsr.getContentLength();
      data = new byte[contentsize];
    
      try
      {
        InputStream tmp_is = hsr.getInputStream();
        int rb = tmp_is.read(data);
        tmp_is.close();
        _logMsg ("IIUploader: " + rb + " Bytes of " + contentsize + " readed.");
      }
      catch(IOException ioe)
      {
        throw new IIError();			 
      }
    }
    

    Entsprechend der Aussage von Sun "read some bytes.." erhalte ich hier nur ca. 8 kB von den erwarteten 40 kB.

    Wie kann ich sicherstellen, das ich ALLE Daten erhalte?



  • Benützt mal lieber:

    int tatsaechlich_gelesen = tmp_is.read(data,0,contentsize);
    

    Solange tatsaechlich_gelesen == contentsize führst du die Schleife aus.

    MfG SideWinder



  • Da hier bis zu 200 kB gesendet werden können, befürchte ich, den Server mit einer solchen Schleife zu blockieren. Gibt es nicht sowas wie sleep oder ähnliches, um dem InputStream Zeit zu geben?



  • Da habe ich die Beschreibung und wohl auch den Beitrag von SideWinder falsch verstanden. Das Offset als Parameter bezieht sich nicht auf den Stream sondern auf das übergebene Array!

    Das read generell 8 kB liefert, ist wohl kein Zufall. So funktionierts jetzt:

    //! The constructor which expects HttpServletRequest as parameter.
    public IIUploader(HttpServletRequest hsr) throws IIError
    {
      contentType = hsr.getContentType();
      int contentsize = hsr.getContentLength();
      data = new byte[contentsize];
    
      try
      {
        int rb = 0;
        InputStream tmp_is = hsr.getInputStream();
        do
        {
          rb += tmp_is.read(data, rb, contentsize-rb);
          _logMsg ("IIUploader: " + rb + " Bytes of " + contentsize + " readed.");
        } while (rb < contentsize);
        tmp_is.close();
      }
      catch(IOException ioe)
      {
        throw new IIError();			
      }
    }
    

    Jetzt muss ich in dem Gewusel nur noch meine Grafik finden! 🙂



  • readed

    😃 😃



  • Schätze mein Englisch-Lehrer würde sich im Grabe umdrehen, wenn er nicht noch leben würde. 🤡

    Peinlich... 😃


Anmelden zum Antworten