Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
Code:
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:
Code:
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...
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...
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..
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..)
DADUpload = Java (class) Datei was extends HttpServlet hat
Gebuffered wird nüschts sieht so aus
Code:
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
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\)
wenn keine ExtraMechanismen implementiert (oder die Datei in einem vom Webserver öffentlich zugänglichem Verzeichnis liegt) sind dann kannst du darauf nicht zugreifen??
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....)
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...
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)
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!!
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..)
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.
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..
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...
- 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
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..)