# Applet Datei speichern!



## thE_29 (9. Jan 2006)

Hi!

So, muss für einen anderen Teil unserer Fa. ein Applet schreiben, da die dort keine Ahnung von Java haben 

Nur habe ich keine Ahnung von Applets :bae:


So, habe da ein CodeTeil von denen, wo sowas ist:


```
URL urlDest = new URL(st_UploadDestination);
      URLConnection urlconDest = urlDest.openConnection();
DataOutputStream outp = new DataOutputStream(urlconDest.getOutputStream());
      
      System.out.println("para_st_FileName " + para_st_FileName);
      BufferedInputStream bufin = new BufferedInputStream(new FileInputStream(para_st_FileName));
```


Also, das geht soweit auch alles!!

So, nun schreibe ich die Datei auf den Outputstream hinaus (es wird nichts am Server angelegt..)

Er gurkelt einfach die ganze Datei dort rein!!

Es wird am Server aber nichts erzeugt!

So, nun wird danach dieser Befehl aufgerufen:


```
InputStream in = urlconDest.getInputStream();
```


Dieser Befehl verursacht, das die Datei erzeugt wird!!

Dh, der steht solange bei dem Befehl, bis die ganze Datei am Server oben ist... (toll!!!!!!!!! wasn das fürn kack?)

Das geile ist, das nachher noch eine while Schleife ist, wo eigentlich erst die write Befehle kommen...

Jedenfalls geht der dort sowieso nie rein...


Meine Frage nun, ist das immer so? Ist das so gewohlt dass, das so gehn soll... oder ist bei mir was falsche oder hats da überhaupt was oder spielt das mit der Uploadestination zusammen oder sonstiges...

Bin für jede Hilfe dankbar!


----------



## Roar (9. Jan 2006)

was is denn st_UploadDestination ? eine ftp URL? oder was...
ansonsten versteh ich von deinem text nur bahnhof :bahnhof: (vielleicht mal weniger !!! und mehr wörter  )

und in der suchfunktion findest du auch einiges über ftp upload



> Ist das so gewohlt dass, das so gehn soll... oder ist bei mir was falsche oder hats da überhaupt was oder spielt das mit der Uploadestination zusammen oder sonstiges...


 :bahnhof: ^^


----------



## thE_29 (9. Jan 2006)

Nö, http ist das!

Ist so ein Lotus Domino Applet Blödsinn, vai Servlet, etc...


Und was ist an dem Text so schwer zu verstehen?

Ich habe die output Methoden, schreibe auf diese raus (via while Schleife bis Datei aus ist)=> (datei existiert am Server nicht), dann kommt die Methode getInputStream und dann wird erst die Datei erzeugt...

Ist das immer so oder warum kommt die Datei erst dann und (das blöde) das getInputStream dauert solange bist die Datei da ist..


----------



## Sky (9. Jan 2006)

Wird nach dem Schreiben sowas wie ein "flush" oder "close" gemacht ?


----------



## thE_29 (9. Jan 2006)

jo wird gemacht!

Und nein er steht nicht dort, er steht bei dem getInputStream!!


Glaubt mir ich weiß wann ich Angaben mache wo der Hund begraben ist, ich debug lieber 2 Tage und stelle erst dann die Frage bevor ich so einen hirnlosen Fehler mach..
(hab sogar mal probiert das ich nach jedem write ein flush mache, bringt aber nix..)


----------



## thE_29 (9. Jan 2006)

So, habs hier nochmal "gezeichnet"

Vielleicht versteht ihr mich dann besser 

http://forum.geizhals.at/files/7189/applet.doc


Und nochwas: Es bleibt genau dort hängen sonst nirgends anders!

Ich lasse mir alle Exceptions, etc ausgeben es steht nur dort und sonst nirgends!


----------



## MPW (9. Jan 2006)

Aehm, ist der Output vllt. auch gebuffered, ist jetzt da in deinem Code nicht zu sehen, koennte ja aber sein....

Poste mal die gesammte Prozedur, oder ist das was Firmenrelevantest, was nicht gesehen werden darf? ???:L 

Zu dem, dass der da haengt: Versuch es mal mit Threads!x10


----------



## Bleiglanz (9. Jan 2006)

jetzt mal langsam:

wie sieht die URL aus?

normalerweise hat eine URL keinen vernünftigen OutputStream??

willst du vielleicht ein HTTP POST machen?


----------



## thE_29 (9. Jan 2006)

1. wird es mit Threads gemacht.

2. Das ganze läuft auf Lotus Notes Domino

3. die url sieht so aus: http://www.hier_steht_server.at/servlet/DADUpload

DADUpload = Java (class) Datei was extends HttpServlet hat

Gebuffered wird nüschts sieht so aus


```
DataOutputStream outp = new DataOutputStream(urlconDest.getOutputStream());
      BufferedInputStream bufin = new BufferedInputStream(new FileInputStream(para_st_FileName));
      while ( (i = bufin.read()) != -1)      
{
        len++;
        outp.write(i);
}
      outp.flush();
      outp.close();
      InputStream in = urlconDest.getInputStream(); //und hier hängt er dann
```


----------



## Bleiglanz (9. Jan 2006)

so geht das nicht, wahrscheinlich sollst du einen HTTP POST Request absetzen...?


----------



## thE_29 (9. Jan 2006)

Tjo, es geht so aber 

Nur schreibt er die Datei halt erst bei dem getInputStream()

bzw, er hat sie fertig geschrieben wenn er mit der Methode fertig sit!


Bzw, was meinst du mit HTTP POST?


Nachtrag: Das ganze geht über Lotus Domino, maybe ist da irgendwas irgendwie anders...!


----------



## thE_29 (10. Jan 2006)

sooooo!

Habe mich mit Debugger und decompilierer mal auf den Weg gemacht und bisi gestöbert!

Jedenfalls ruft das getInputStream einen httpPost auf!

Und anscheinend wird in der Uploader Klasse auf diesen httpPost reagiert und dann die Datei geschrieben...


Jedenfalls wie kann ich mit der urlconnection oder irgendwas anderem auch einen httpPost aufrufen?

Weiß das jemand?


----------



## Bleiglanz (10. Jan 2006)

http://javaalmanac.com/egs/java.net/Post.html

übrigens ist eine HTTP fileupload wieder etwas anderes...

gibts keine doku über das Servlet, das du ansteuerst?


----------



## thE_29 (10. Jan 2006)

Mhm... IBM...

Weiß net... Ich habe ja net mal die Notes.jar gefunden zum dl (seite konnte nicht gefunden werden bei IBM..) 

Aber zum Glück braucht das Notes selber auch die Notes.jar, so konnte ich wenigstens mal die Klasse kompilieren...


Extenden tut das Servlet aber dem ganz normalen HttpServlet!

Nur sind in der Methode doGetPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException

lauter Abartigkeiten von lotus.domino.* drinnen...


----------



## thE_29 (10. Jan 2006)

Achja...

Kann ich dem Post irgendwie eine Art von Listener oder Interface mitschicken??

Weil dann schick ich dem so ne Klasse mit wo er mir zurückmeldet wie weit er ist...!


----------



## Bleiglanz (10. Jan 2006)

nein, aber du weisst ja am client wieviel er schon geschrieben hat?


----------



## thE_29 (10. Jan 2006)

Eben nicht...

Der schreibt es ja erst wenn man getInputStream aufruft!!

Zuerst haut er das ganze in eine Art "Buffer"

Der Aufruf getInputStream ruft ein http.getPost auf, der wiederum die Datei schreibt!

Meine Überlegung war es, dem irgendwie eine Art "Listener" mitzugeben wo er den Fortschritt reinschreibt...


----------



## Bleiglanz (10. Jan 2006)

thE_29 hat gesagt.:
			
		

> Achja...
> 
> Kann ich dem Post irgendwie eine Art von Listener oder Interface mitschicken??
> 
> Weil dann schick ich dem so ne Klasse mit wo er mir zurückmeldet wie weit er ist...!



das geht nicht, HTTP ist Hit and Run - und hat mit Java nichts zu tun - wie sollte es da Callbacks geben???


----------



## thE_29 (10. Jan 2006)

Arggglll!!

Und wenn ich ne Datei erzeuge und dort die % Angabe reinschreibe??

Kann ich via urlConnection drauf zugreifen oder?? 

Oder wie lese ich die Datei aus?


----------



## Bleiglanz (10. Jan 2006)

kannst du mal nochmal genau erklären um was es geht

Mitspieler

1) ein Applet beim "Client"

2-a) es gibt irgendwo auf einem Webserver ein Servlet = "der Server"

2-b) du hast eine URLConnection zu diesem Servlet

3) irgendwo ist eine Datei

Ziel: die Datei soll irgendwo (zum Servlet?) hingeschickt werden?

Wenn du nicht weisst, ob das Servlet einen HTTP-Fileupload, einen normalen POST oder was weis ich erwartet funktioniert das NIE!


----------



## thE_29 (10. Jan 2006)

1. jop, ein Applet was via Lotus Notes ID und in Notes eingebunden ist 

2a. der Notes Domino Servlet Server
2b jop urlconnection auf das servlet

3. die Datei wird aufn Server in C:\temp\DOCUMENT_ID abgelegt


So, ich schreibe jetzt auch eine Datei (status.log) in dieses Verzeichnis (DOCUMENT_ID ist Unique für jeden Upload und ist dem Applet bekannt, da dieses dem den Server mitteilt)

So, kann ich nun via urlConnection irgendwie auf das zugreifen?? (Achtung, die urlconnection zeigt nicht auf C:\temp sondern auf C:\lotus\domino\data\domino\servlet\)

Geht den das dann überhaupt?


----------



## Bleiglanz (10. Jan 2006)

Ja was denn nun? 

du hast eine Datei "aufn Server"??

wenn keine ExtraMechanismen implementiert (oder die Datei in einem vom Webserver öffentlich zugänglichem Verzeichnis liegt) sind dann kannst du darauf nicht zugreifen??

wo ist "C:\"? auch aufm Server??


----------



## thE_29 (10. Jan 2006)

Jop!

Die Datei liegt aufn Server...



So, also die Methode die schreibt sieht so aus:


```
public void doGetPost(HttpServletRequest request,
                        HttpServletResponse response) throws IOException
```

Dort wird vom request.getInputStream geholt und dann geschreibselt!

Problem!

Das getInputStream und das schreiben verweilt ja solange bis es fertig!

Dh, er steht beim Aufruf von getInputStream im Applet!


Meine Lösung: Mache nen Thread fürs schreiben und schreibe via response.getWriter().println("%"); zurück wie weit ich bin!

Blöd ist, das der outputstream geclosed wird, sobald er aus der getPost Methode rausgeht!! (bzw, das response objekt)

Der InputStream aber nicht (das ist irgendwie komisch..)

Kann man das irgendwie länger am Leben halten oder wie kann ich sonst mit dem Benutzer "kommunizieren", da das request Objekt ja eigentlich am Leben bleibt (ist so, da er auch wenn das "normale" java applet schon tod ist, schreibt er immer noch brav weiter....)


----------



## Bleiglanz (10. Jan 2006)

versteh ich nicht

in doPost muss er ja alles einlesen, erst dann kann er die Methode beenden

während des einlesens schreibst du deine %Angaben in den response

muss funktionieren, warum sollte er doPost abschliessen, wenn er noch nicht fertig eingelesen hat???

P.S. du kannst - im Servlet - keine Threads verwenden, wenn ein HTTP Request fertig bearbeitet ist, dann wird normalerweise die TCP-Verbindung vom Webserver einfach zugemacht...


----------



## thE_29 (10. Jan 2006)

Ich kann ja nicht antworten!!


Weil er im Applet ja solange beim urlconDest.getInputStream() steht, bis die getPost Methode fertig ist!!


Ich teste mal was anderes kurz aus und meld mich dann mal wieder...


----------



## Bleiglanz (10. Jan 2006)

dann mach halt am Server in doPost

als allererstes den response.getWriter auf

dann 8 kB vom Input lesen

in den responsewriter  "8 kB gelesen" schreiben

responsewriter.flush

dann weiterlesen

usw. usf

am ende dann closen


----------



## thE_29 (10. Jan 2006)

Applet ruft urlconDest.getInputStream() auf!

Im Applet soll aber eine Prozentausgabe (wie weit geschrieben) dargestellt werden!!

So, der steht aber bei dem Befehl solange, bist die doPost Methode fertig ist!

Danach, kann ich erst auf Ereignisse die der writer geschrieben hat zugreifen!!

Dh, das bringt mir rein gar nix!!

Da ich ja zur Zeit wo es geschrieben wird, schon den Inputstream im Applet brauchen würde...!

Diesen bekomme ich aber erst wenn die Datei fertig geschrieben ist (daher war meine Idee mit dem Thread, da dadurch ja die doPost Methode fertig durchlaufen wird)


----------



## Bleiglanz (10. Jan 2006)

mach halt zuerst getOutputStream und dann erst getInputStream?

und überhaupt bin ich einfach verwirrt 

du schreibst daten in den Outputstream und schickst dadurch Daten an das Servlet...

dabei weisst du doch, was du reinschreibst???!!!

und dann willst du dir vom Servlet nochmal zurücksenden lassen, was bzw. wieviel du reingeschrieben hast???


----------



## thE_29 (10. Jan 2006)

Das ist ja der Oberkack!!!


Der speichert beim schreiben in den outputsream NICHTS!!!! (bzw nur im stream)

Der speichert erst dann wenn man im Applet getInpuStream() aufruft!!

Was weiss ich warum das so blöd gemacht worden ist...

Was glaubst du wie verwirrt ich bin!


Also, Applet schreibt in getOutputStream (am server wird nichts gemacht)

Applet ruft getInputStream auf um Antworten zu schaun => jetzt wird erst die Datei angelegt!!! (bei 22 MB steht der bei dem Befehl solange bis die 22 MB oben sind) und dann geht er weiter!

Dann gehe ich in die Schleife und bekomme die nachrichten von 0 - 100 (% angaben) wie weit er beim Datei schreiben ist..

Nur interessiert mich das, wenn die Datei schon fertig geschrieben ist nicht mehr.. Ich müsste es halt wissen, dann wann es passiert!

Ich guck mir das httpservlet mal genauer an..

Ich glaub das schreiben muss einfach in eine andere Methode!!


----------



## Bleiglanz (10. Jan 2006)

was soll er auch "speichern"

dass am Server eine Datei erst angelegt wird, wenn ALLES da ist ist doch kein Beinbruch

also nochmal:

du hast - im Applet - in deinen Outputstream die Hälfte aller Daten reingeschrieben, das weisst du doch selber

und jetzt willst du unbedingt von Server die Nachricht "50 % empfangen"? wozu??


----------



## thE_29 (10. Jan 2006)

Noooo!

Du verstehst mich nicht 

Ich geh zeichnen :bae:


----------



## thE_29 (10. Jan 2006)

http://forum.geizhals.at/files/7189/applet2.doc

Es ist genau so wie ich beschrieben habe!

Er steht nirgends anders oder irgendwas..


Genau so wie es dort steht (und auch in der vorigen Zeichnung) so trifft es zu und da brauch ich nicht zu diskutieren..


Mein Problem ist halt, das ich es net so will....


----------



## Roar (10. Jan 2006)

wenn du gleichzeitig was hochladen willst und das applet weiter reagieren soll brauchst du natürlich einen weiteren thread.


----------



## thE_29 (10. Jan 2006)

Tjo, nur geht das aber net, da sich wenn ich einen Thread mache, der HttpServletResponse verabschiedet, auf dem ich die Nachrichten zurückschicken würde.. (warum auch immer, da ja der inputstream = ja dann auf dem Server der outputstream noch da ist..)


----------



## Roar (10. Jan 2006)

was hat das denn damit zu tun :bahnhof: du musst beim client - dem applet - nen neuen thread erstellen und dort deinen hochlade-und-was-weiß-ich-code reinstopfen.


----------



## thE_29 (10. Jan 2006)

Das hochladen wird ja angezeigt!!!

Das ist das was er in den outputstream schreibt (ist die Zeichnun so schwer zu verstehen?!?!)

So, das ganze wird aber erst wirklich geschrieben, wenn man getInputStream sagt und da hängt er dann bis die Datei fertig geschrieben ist (Server seitig!!! nur blockiert der das Applet genauso, da ja der auf den Befehl wartet wenn er fertig ist)

Mache ich dort einen Thread, so gehts nicht, da sich der response verabschiedet..


----------



## Bleiglanz (11. Jan 2006)

du musst DAS GANZE in einem eigenen Thread machen
(und der aktualisiert gemütlich deine Progressbar)

d.h. ALLES was mit dieser URL in Zusmmenhang steht (lesen/schreiben) soll in diesem Thread gemacht werden

=> du kannst nicht von ThreadA lesen und von ThreadB aus schreiben auf eine HTTP verbindung, das muss schiefgehen

dass ein Thread schreibt und ein anderer den Fortschritt vom response des Servlets liest ist ein totaler Holzweg


----------



## thE_29 (11. Jan 2006)

Es geht einfach net...

Habs jetzt anders gemacht, indem ich ein 2tes Servlet anspreche was mir zurückgibt wie weit die Datei schon erzeugt ist (also die Länge)


----------



## Bleiglanz (11. Jan 2006)

dieser Thread führt noch dazu dass ich mal ausflippe

du WEISST DOCH WÄHREND DES UPLOADS im Applet wieviel daten du schon an das Servlet geschickt hast - einfach "mitzählen"

WOZU ZUR HÖLLE lässt du dir diese Information dann nochmal von dem Servlet zurückschicken, das ist doch völliger VollQuark??


----------



## thE_29 (11. Jan 2006)

Kapierst du die Zeichnung net??

Ich loade es up in den Stream (DIE DATEI STEHT NUR IN DIESEM VERBLÖDETEN STREAM ABER NICHT AUF DEM SERVER!!!!)

Dann rufe ich die Methode (im Applet) getInputStream() auf => DIESE Methode führt DAZU das die DATEI jetzt erst geschrieben wird!
DIESE METHODE BLOCKIERT DAS APPLET TOTAL!!!!!! Auch wenn ich nen 2ten Thread da mache, wie soll ich auf eine lokale Datei am Server zugreifen?!?!

Und die Methode getInputStream() ist dann fertig, wenn die Datei komplett am Server ist (bei 22 MB steht das Applet an der 1en Codezeile 2 minuten lang!!!! Toll was bringt mir ein Thread oder dergleichen??)

Und ich will ne Fortschrittsanzeige wie weit er eben beim Schreiben ist! Nur wie soll ich mit 1em Servlet das machen, wenn das Servlet dort solange hängt, bis die Datei fertig ist!!


Genauso stehts in der Zeichung und wenn ihr net fähig seid (tut mir leid, ist aber so, bis jetzt kapierts einfach keiner) das zu kapieren, dann kann ich euch net weiterhelfen...

Es ist einfach so wie es dort beschrieben ist.


Uploade => in stream (steht nirgends außer im stream)

rufe getInputStream() auf => invoked doPost im HttpServlet => schreibt die Datei auf den Server (dh, ich kann nicht kommunizieren mit dem Servlet, da dieses ja grad beim Schreiben ist! Hier gehn keine Threads, wie du selbst gesagt hast!)

Das in den Stream laden geht ruck zuck (braucht für 22MB ca. 30 sek.) aber erst wenn er die Datei speichert, das dauert und hier ist das Problem mit einer Fortschrittsanzeige!


Lösung: 2tes Servlet was den Dateinamen übergeben bekommt sieht nach wie "groß" die Datei ist und schickt mir die Länge zurück!
Im Applet weiß ich wie groß sie sein sollte und somit finde ich raus wie weit er beim Datei schreiben ist...


----------



## Bleiglanz (11. Jan 2006)

kannst du vielleicht mal erklären was


> Ich loade es up in den Stream


ist?

ist doch auf AppletSeite ein OutputStream, in den du hineinschreibst?



> FileInputStream liest und schreibt alle Daten in diesen OutputStream (mit ProgressBar der auf 100 läuft.. schöne Prozentanzeige)



nochmal die Situation:

- der eigentliche upload mit ProgressBar läuft schon ganz gut

- und jetzt willst du ZUSÄTZLICH nochmal einen Progressbar, der anzeigt wie weit das Servlet beim Speichern des angekommenen Materials in eine (lokale) Datei auf dem Server jetzt gerade ist

das ist nicht so einfach (wegen der Content-Length Header, Chunked Data und so weiter)

nurmal zur Info:

eine HTTP Anfrage an ein Servlet ist KEIN Socket

warum der Upload schneller gehen soll als das lokale Speichern in eine Datei ist mir völlig unklar, das kann ja eigentlich nicht sein?

soweit ich sehe ist die Krücke mit zwei Servlets für den Fall das einzig mögliche


----------



## thE_29 (11. Jan 2006)

Jop...

Sehe ich auch so...!


Frage ist nun solle ich beim 2ten Servlet die Länge der Datei zurückgeben oder aber ich schreibe vom 1ten Servlet aus eine Datei deren Inhalt die aktuelle weite ist (in prozent).

Hatte schon beide Methoden, nur irgendwie ist die mit 2 Methoden genauer (weil die Datei net immer geflushed wird..)


----------



## thE_29 (11. Jan 2006)

Juhu 

So gehts...

Die Prozentanzeige war zwar mit 2 Files besser, aber ich lass nur das 1e File... (mir ja egal..)

Problem war halt, das anstatt das ein POST gesendet wird (in den Stream) dort schon die ganze Datei drinnen liegt..

Also so ne Art "billig" Ftp ist das ja..


----------

