Avatar billede luctatic Nybegynder
05. november 2002 - 16:13 Der er 24 kommentarer og
1 løsning

Paths der ikke virker

Jeg har for sjov prøvet at lave en JSP side, der ta'r en mappe med billeder på min computer og smider dem op på en webserver. Problemet er bare at jeg ikke kan få fat i det rigtige directory.

Forestil jer, at .jsp siden bliver kørt fra d:/peter/datamatiker/java/webprog/, og at det er roden for webserveren. Dvs at når man connector til min webserver på <http://www.alpha-omega.dyndns.dk:6000> leder serveren i d:/peter/datamatiker/java/webprog/. Så langt så godt - det virker nemlig. Her kommer problemet.

Som I kan se i koden nedenfor, så henter jeg stien til mappen d:/peter/datamatiker/java/webprog/temp hvor der ligger en række billeder så kan jeg gøre det på to måder.

1) File tempfile = new File("d:/peter/datamatiker/java/webprog/temp");

2) File tempfile2 = new File("./temp/");

Via måde nummer et får jeg fat i præcis den rigtige mappe, men den kan man ikke se udefra da det er en absolut sti. Via måde nummer to (som er den måde det normalt gøres i HTML) får jeg fat i noget HELT forkert. Af uransagelige årsager, så kigger webserveren ikke ikke efter "./temp" i "d:/peter/datamatiker/java/webprog", men i stedet i "D:\Programmer\java\forte4j\bin", og dermed finder den naturligvis ikke noget som helst.
<p>
Spørgsmålet er så, hvordan grejer jeg lige det problem hvis jeg hverken må bruge absolutte eller dynamiske stier? I kan se resultatet af koden på <a href=http://www.alpha-omega.dyndns.dk:6000/pics.jsp>min server</a> og koden er sat ind nedenfor.

***KODE***

File tempfile = new File("d:/peter/datamatiker/java/webprog/temp");
File tempfile2 = new File("./temp/");
File[] files = tempfile.listFiles();
int length = files.length;
int col = 3;
int rows = (length/3);

String str1 = tempfile.toString();
String str2 = tempfile2.toString();
%>Is "<%= str1 %>" a directory?
<%
if (tempfile.isDirectory())
%>Yes. <%
else
%>No.
<br>

Is "<%= str2 %>" a directory?
<% if (tempfile2.isDirectory())
%>Yes. <%
else
%>No.
<br>
<%
String str3 = tempfile.getCanonicalPath();
String str4 = tempfile2.getCanonicalPath();
%>
"<%= str1 %>" is being translated to "<%= str3 %>".
<br>
"<%= str2 %>" is being translated to "<%= str4 %>".


***KODE SLUT***



PS: Kan også se dette spørgsmål på http://alpha-omega.dyndns.dk/help.htm
Avatar billede luctatic Nybegynder
05. november 2002 - 16:15 #1
Hehehe - anede ikke at dette forum oversatte links direkte - ser lidt sjovt ud med HTML kode inde midt i det hele :D
Avatar billede di8leva Nybegynder
05. november 2002 - 16:57 #2
jag antar att du skriver dubbel slash i java-koden??
/ --> //
Avatar billede di8leva Nybegynder
05. november 2002 - 17:03 #3
i filnavn menar jag
Avatar billede di8leva Nybegynder
05. november 2002 - 17:04 #4
oops, nu tenker jag forkert.. der skall vare dubbel backslash tror jag

d:/peter/datamatiker/java/webprog/temp --> d:\\peter\\datamatiker\\java\\webprog\\temp
Avatar billede di8leva Nybegynder
05. november 2002 - 17:05 #5
fock.. jag er helt borta... jag oppfattade ikke spörgsmålet korrekt...
ignorera mina kommentarer helt =)
Avatar billede luctatic Nybegynder
05. november 2002 - 17:06 #6
nej - java vil helst have at man bruger '/' til at dele directories med. Compileren forstår det bedst sådan :D
Avatar billede disky Nybegynder
05. november 2002 - 17:09 #7
Dit problem er her at serveren skal vide hvor dine filer er absolut i forhold til din server.

Det du kan gøre er at angive dine filer absolut i forhold til roden af din webserver.

File tempfile=new File(new URI("http://www.alpha-omega.dyndns.dk/temp"));

Og så bruge den.
Avatar billede disky Nybegynder
05. november 2002 - 17:15 #8
Jeg er skuffet.

Ud fra filer på din server kan jeg se du er fjenden. :-)

Rart at se du også spiller Daoc (dog forkert realm)

jeg er selv en lvl 45.5 Theurgist på Merlin serveren.
Avatar billede luctatic Nybegynder
05. november 2002 - 17:37 #9
Hehehe Disky - så kan du lære det - vi skal nok få hentet de relics igen - vær nervøs - vær meget nervøs.

Nå, men for at komme tilbage til det hele, så kan jeg rigtignok bruge en URL til at placere mine filer, men de ville unægteligt være rart hvis jeg kunne skifte min URL eller lignende ved ikke at bruge absolutte stier - de er ikke altid det bedste valg efter mine erfaringer. Jeg har et program jeg kan bruge til at lave thumbnails, og det virker fint på http://www.alpha-omega.dyndns.dk/daoc_pics/index1.html men det ville nu være bedre hvis jeg bare kunne smide et billede ind og så klarede serveren selv resten - og så ville det på den anden side være meget sjovere at lave det selv. Bare for at gøre det :D
Avatar billede disky Nybegynder
05. november 2002 - 17:50 #10
Det du skal gøre er at istedet for at bruge FIle skal du bruge URL istedet, og så angive path'en til dine filer i forhold til roden af din webserver.

Du skal dog angive den absolut, men server navn osv, kan du få via:

request.getRequestURL() som returnerer server navn og path som en String

Så klipper du server navn ud, og bruger den til at generere en path med.

p.s. I har ikke en chance :)

www.mystic-council.com
Avatar billede soelvpil Nybegynder
05. november 2002 - 17:51 #11
I stedet for

File tempfile2 = new File("./temp/");

skal du i stedet bruge

File tempFile2 = new File( application.getRealPath("/temp") );

hvor /temp naturligvis er stien relativt til roden af din webapplikation.
Så burde det spille.
Avatar billede soelvpil Nybegynder
05. november 2002 - 17:52 #12
Er ikke helt sikker på om "/" skal med, men tror det er ligegyldigt. Prøv dig frem.
Avatar billede disky Nybegynder
05. november 2002 - 17:54 #13
interessant soelpil, men finder den ikke path'en til serverens rod som ikke nødvendigvis er det samme sted som web filerne
Avatar billede luctatic Nybegynder
05. november 2002 - 18:03 #14
Kigger lige på de to muligheder - brb.
Avatar billede soelvpil Nybegynder
05. november 2002 - 18:21 #15
disky: nope, det er webapp'ens rod (men bruger man et eller andet med en default servlet context kan det måske være det samme?).
Avatar billede disky Nybegynder
05. november 2002 - 18:25 #16
kanon, så lærte jeg også noget i dag :)

Luctatic: soelvpil's løsning er klart den bedste (hvis den virker)
Avatar billede luctatic Nybegynder
05. november 2002 - 18:44 #17
Gjorde som du sagde soelvpil.

File tempfile = new File(application.getRealPath("/temp/"));


Resultatet:
Is "D:\Peter\Datamatiker\Java\Webprog\temp" a directory? Yes.
"D:\Peter\Datamatiker\Java\Webprog\temp" is being translated to "D:\Peter\Datamatiker\Java\Webprog\temp".
Avatar billede luctatic Nybegynder
05. november 2002 - 18:51 #18
Og for at gøre det endnu bedre, så kan jeg nu ikke åbne filen i min eksterne webserver (SUN ONE webserver), men kun på den der følger med Forte (programmet jeg bruger til at udvikle jsp), som er Tomcat.

Så umiddelbart lyder løsningen ok, men hvis application.getRealPath også henter en absolut path internt kan jeg ikke bruge den til meget eksternt.
Avatar billede soelvpil Nybegynder
05. november 2002 - 19:08 #19
OK, måske fik jeg ikke læst spørgsmålet detaljeret nok.

Du er nødt til at kombinere de to metoder. Jeg går ud fra at du lister alle filerne med links til, hvordan man kan downloade dem???

Du skal bruge den lange sti (som ovenfor) til at finde filerne. Men url'en i serveren skal være den korte, relative sti.

<%
String[] files = tempFile2.list();
for (int i=0;i<files.length;i++) {
%>
  <a href="./temp/<%=file.getName()%>"><%=file.getName()%></a>
<%
}
%>
Avatar billede luctatic Nybegynder
05. november 2002 - 19:18 #20
Se nu nærmer vi os.... leger videre...
Avatar billede luctatic Nybegynder
05. november 2002 - 19:49 #21
Ok - nu skal jeg lige ha' styr hvad jeg har gang i:

<%
String pic_path = new String("d:/peter/datamatiker/java/webprog/temp");
File tempfile = new File(pic_path);
File[] files = tempfile.listFiles();
int length = files.length, col = 3, rows = length/3;

<table rows="<%= rows %>" col="<%= rows %>" border="1"><%
count=0;
for (int i=0;i<rows;i++)
    {
    %><tr><%
        for (int j=0;j<col;j++)
        { %>
        <td>
        <% if (count==length) break;%>
        <img src='./temp/<%= files[count++].getName() %>'></img>
        </td>
        <%
        } %>
        </tr>
        <% } %>
</table>

Sådan ser det ud nu. Og det virker udmiddelbart som jeg ville. Så som sådan har du besvaret mit spørgsmål til fulde. Nu vil jeg lige høre en lille ekstra ting. Er det muligt at ændre "pic_path" og lægge billederne et andet sted end i webapp roden? Jeg prøvede, men så skal der ændres lidt i hvordan serveren linker internt vel.
Avatar billede soelvpil Nybegynder
05. november 2002 - 20:11 #22
En lille kommentar:

Hvis du erstatter
String pic_path = new String("d:/peter/datamatiker/java/webprog/temp");

med
String pic_path = application.getRealPath("temp");

får du nøjagtig samme resultat. Dog med den gevinst, at selv hvis du flytter din løsning til en maskine hvor serveren ligger et andet sted, vil det hele stadig virke.

Og til dit andet spørgsmål: Ja, det er muligt, men lidt mere avanceret. I grove træk ville jeg gøre det på denne måde: Jeg ville lave en Servlet, der blev tilmeldt med urlen "/temp". Hvis jeg vil have filen temp/test.jpg kalder jeg så med urlen ./temp/test.jpg. Dette vil tage fat i servletten, som så fra urlen aflæser, at det er test.jpg der spørges efter. Servletten finder filen, åbner den, og læser den tegn for tegn, og printer hvert tegn ud til outputwriteren.

Lyder ovenstående som volapyk? Det kunne være interessant at pusle med hvis man havde tid. Hvis du får lyst og mod på opgaven er du velkommen til at spørge igen.
Avatar billede luctatic Nybegynder
05. november 2002 - 20:18 #23
"Jeg ville lave en Servlet, der blev tilmeldt med urlen "/temp"."

Her mener du at man ville kunne fange servletten med /servlet/temp? For hvis det er sådan kan det sagtens lade sig gøre - ikke lige nu dog, men en sjov udbygning. Jeg si'r mange tak.
Avatar billede luctatic Nybegynder
06. november 2002 - 13:31 #24
BTW Disky - jeg SAGDE jo vi fik det relic tilbage! :D
Avatar billede disky Nybegynder
06. november 2002 - 13:48 #25
okay da :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester