» »

[Java] servlet - kako upload-at iz klienta v servlet

[Java] servlet - kako upload-at iz klienta v servlet

Fizikalko ::

, pa kaj je treba na klientu narest - preko forme ali kako? Rad bi recimo iz klienta pobral sliko na server (v servlet). Mislim nekako preko ServletInputStream-a, pa ne vem, kako oz. kako klient odda sliko...

kopernik ::

Privzeto (po specifikaciji J2EE) ne obstaja nek razred, ki bi znal ravnati z multipart requesti. Zato imaš dve možnosti :
* prebereš celoten inputstream in zadevo sparsaš (glej HTTP specifikacijo ali kakšen RFC) ~ najbrž ti to ne diši :-)
* uporabiš knjižnico, ki zna to početi file upload

DMouse ::

Ta knjižnjica je sicer ql, ampak utegneš imeti težave s šumniki...

Fizikalko ::

Zakaj pa se potem uporablja SetvletInputStream in pa read metoda v njem?

kopernik ::

Za branje podatkov, ki prihajajo od clienta. Isto kot FileInputStream uporabiš za branje podatkov iz datoteke.

Saj ti lahko vse prebereš iz ServletInputStream-a, samo, a ima smisel ? Ker se boš moral ukvarjati s parsanjem headerjev in vsebine (pač, po definiciji HTTP protokola), kar ti lahko vzame precej časa. Multipart requesti žal niso po predvideni oz. zahtevani v servlet specifikaciji (torej jih tudi razne implementacije - Tomcat, Resin, itd. - ne bodo poznale), zato je najlažje uporabiti neko knjižnico, ki to že zna.

Fizikalko ::

To že razumem, da bi moral parsirat vsebino, ampak ni mi jasno, kako client sploh prilepi sliko v body...

kopernik ::

Ne štekam točno, kaj te matra. A ti pišeš web aplikacijo, ki se bo uporabljala v browserju, ali pišeš nek svoj, custom client in te zanima, kako deluje HTTP protokol ?

Sicer pa, naredi eno html stran, kjer narediš upload fajla (mislim da je input type="file") in naredi request iz firefoxa na tvoj servlet ter poglej, kaj si dobil od browserja. Pri svojem clientu se pač zgleduješ po temu, kar je poslal browser.

Tukaj si poglej, kako se naredi HTML za upload fajla : htmlhelp

Zgodovina sprememb…

  • spremenil: kopernik ()

Fizikalko ::

Ja, Web aplikacijo delam. To sem rabu, ja. Hvala ti še enkrat in lp.

Fizikalko ::

Še nekaj, malo off topic.
Kaj pa, ko delam objekte na nek url (URLConnection). Recimo, da imam na tem URLju redirection na nek drug URL, jaz pa želim, da ne gre takoj tja, temveč mi vrne sporočilo nazaj (Moved permanently) - (rabim zato, da ne dobim vseh vmesnih cookijev, če je več redirekcij) in grem potem sam na tisti drugi (tretji, četrti,...) naslov.

kopernik ::

Kaj pa, ko delam objekte na nek url (URLConnection)


Ne razumem, kaj misliš s tem. URLConnection uporabiš, ko hočeš odpreti povezavo na nek server (mogoče na svoj servlet ?). Torej je namenjen clientom.

Na serverju narediš redirect takole :
protected void doPost(
    HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
  String url = "http:// ...";
  response.sendRedirect(url); //vrne clientu http kodo 302
}


Res pa je, da večina clientov pri takem odgovoru avtomatsko odpre url, ki ga dobi ob redirectu. Če želiš, da se to ne zgodi, pač pošlješ samo kodo, npr. :

protected void doPost(
    HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
  //vrne clientu http kodo 301 
  response.setStatus(HttpServletRequest.SC_MOVED_PERMANENTLY); 
}


Moraš pa v tem drugem primeru še ročno popraviti vsebino responsa (preko response.getOutputStream()). Mislim, da je dovolj, če samo podaš URL, brez dodatkov (npr. response.getOutputStream().write(url.getBytes())). Poglej si HTTP protokol za natančnejša navodila ...

Zgodovina sprememb…

  • spremenil: kopernik ()

Fizikalko ::

Ne, glej: jaz imam redirect na nek URL, t spet naprej itd. Ti URLji niso znotraj, temveč so neki proxyji. Vsak od njih mi dodatno nabaše nek cookie, preden pridem do cilja, tega pa nočem. Želim, da mi dela tako, da ko kreiram nek URLCOnnection in je na tem URLju (ki ni znotraj aplikacije) redirect, želim, da mi ne gre avtomatično tja (in pobere Cookie s tem), ampak vrne novi (redirected) naslov, da ga jaz sam preberem in grem ročno tja in tako mi ni treba imet cookie-jev od cele verige v headerjih. Upam, da razumeš, ker je malo težko razložit...

kopernik ::

Torej uporabi drugi primer. V servletu vrneš s setStatus() željeno kodo (301) in v outputstream zapiši URL, na katerega želiš narediti redirect.

Na clientu v URLConnectionu preberi http response kodo; če je 301 iz inputstreama preberi še URL (ki si ga pred tem nastavil v servletu).

Zgodovina sprememb…

  • spremenil: kopernik ()

Fizikalko ::

Ja, to že, samo jaz ne implementiram serverja, samo klienta... Ne morem ukazat unmu na drugi strani, naj to naredi...

BTW, res hvala za nasvete do zdaj, si mi že veliko pomagal... upam, da ne težim preveč

kopernik ::

Aha, ok.

A si si pogledal HttpURLConnection.setFollowRedirects() ? kopiram iz javadoca :
Sets whether HTTP redirects (requests with response code 3xx) should be automatically followed by this class. True by default. Applets cannot change this variable.


Če tole nastaviš na false, potem bi moglo biti tako, da NE redirecta avtomatično. Nov URL se naj bi nahajal v "Location" headerju responsa ! Torej, connection.getHeaderField("Location") ti naj bi vrnil nov URL. Poglej si rfc za http, stran 83. Preveri, če zadeva dela. Morala bi, če je server pravilno napisan. Sicer pa naredi en snoop na ethernet in poglej, kaj ti vrača tisti server ...

Fizikalko ::

Ja, sem tudi sam že našel. Res je, točno to sem mislil. 100 x hvala, res si v veliko pomoč.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[JAVA] HTTPS client

Oddelek: Programiranje
173058 (1788) peterv6i
»

java v javascript?

Oddelek: Programiranje
211988 (1691) boss-tech
»

[Ajax in Java] v IE6 dela, v Firefoxu ne

Oddelek: Programiranje
241814 (1568) krho
»

tomcat - problem z encodingom

Oddelek: Programiranje
72273 (2187) kopernik
»

Java - JBoss - Servlet - getOutputStream() has already been called for this response

Oddelek: Programiranje
81004 (921) kopernik

Več podobnih tem