Avatar billede nzc Nybegynder
26. februar 2003 - 11:21 Der er 11 kommentarer og
2 løsninger

hent .JPG fra webserver

Hej!

Jeg kunne godt tænke mig at lave et lille prog der kan hente filer fra en webserver. Jeg ved hvordan man henter feks en html-side ned og println'er den

import java.io.*;
import java.net.*;

public class web
{
    public static void main(String[] arg)
    {
        try
        {
            Socket forbindelse = new Socket("www.server.com", 80);

            OutputStream binærUd = forbindelse.getOutputStream();
            InputStream binærInd = forbindelse.getInputStream();

            PrintWriter ud = new PrintWriter(binærUd);

            BufferedReader ind = new BufferedReader(new InputStreamReader(binærInd));

            ud.println("GET /index.html");

            ud.flush();              // send anmodning afsted til værten

            String s = ind.readLine();

            while (s != null)        // readLine() giver null når datastrømmen lukkes
            {
                System.out.println(s);
                s = ind.readLine();
            }
            forbindelse.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Men hvordan gør jeg hvis jeg feks vil hente et JPG-billede og så gemme det på min HD? Skal jeg så oprette en FileWriter og så skrive GET /*.JPG og så skrive hvert billede på HD vha FileWriteren?

NZC
Avatar billede carstenknudsen Nybegynder
26. februar 2003 - 11:35 #1
Du læser den bare binært med en BufferedInputStream og skriver
den til din HD med en BufferedOutputStream som pakker en
FileOutputStream ind. Det er vigtigt at du ikke benytter
Reader og Writer da de er karakterbaserede. Du kan åbne
en URL til filen du vil hente eller udstede et GET request,
det førstnævnte er det simpleste hvis du ved hvad filen hedder.
URL url = new URL("http://www.someplace.com/picture.jpg");
URLConnection con = url.openConnection();
InputStream is = new InputStream();
is=new BufferedInpupStream(is);
FileOutputStream fos = new FileOutputStream("localpicture.jpg");
så læser og skriver du (husk BufferedOutputStream).
Avatar billede carstenknudsen Nybegynder
26. februar 2003 - 11:36 #2
Oops ret lige:
InputStream is = con.getInputStream();
Avatar billede arne_v Ekspert
26. februar 2003 - 11:37 #3
Ja. Du skal hente hver fil enkeltvist.

Der er en HttpURLConnection klasse som er lidt nemmere
end en Socket.

Til at gemme filen med vil jeg nok foreslå en FileOutputStream.
Avatar billede nzc Nybegynder
26. februar 2003 - 12:03 #4
arne_v kan du gi et eksempel på den HttpURLConnection og hvorfor er den nemmere at bruge?
Avatar billede disky Nybegynder
26. februar 2003 - 12:20 #5
nzc
Brug carstens eksempel til det.
Avatar billede arne_v Ekspert
26. februar 2003 - 12:21 #6
HttpURLConnection kender HTTP protokollen og gør det nemmere
at håndtere header-informationen.

Jeg prøver lige at lave et lille eksempel.
Avatar billede carstenknudsen Nybegynder
26. februar 2003 - 12:26 #7
En HttpURLConnection er en URLConnection, og den der er
tale om i mit svar er rent faktisk en HttpURLConnection.
URL url = new URL("http://www.someplace.com/picture.jpg");
URLConnection con = url.openConnection();
InputStream is = new InputStream();
is=new BufferedInpupStream(is);
FileOutputStream fos = new FileOutputStream("localpicture.jpg");
BufferedOutputStream bos = new BufferedOutputStream( fos );
byte[] buffer = new byte[ 4096 ];
int bytes_read;
while ( ( bytes_read = is.read( buffer ) ) != -1 ) {
  bos.write( buffer, 0, bytes_read );
} // while
bos.close();
is.close();
Avatar billede carstenknudsen Nybegynder
26. februar 2003 - 12:27 #8
Igen igen: Oops ret lige:
InputStream is = con.getInputStream();
Avatar billede arne_v Ekspert
26. februar 2003 - 12:31 #9
import java.net.*;
import java.io.*;

public class HttpGet {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://www.microsoft.com/");
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.connect();
            if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream is = con.getInputStream();
                OutputStream os = new FileOutputStream("C:\\z.z");
                byte[] b = new byte[1000];
                int n;
                while((n = is.read(b)) >= 0) {
                    os.write(b,0,n);
                }
                os.close();
                is.close();
            }
            con.disconnect();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
26. februar 2003 - 12:33 #10
disky & carsten>

HttpURLConnection har lidt ekstra metoder og konstanter, som man kan
have nytte af.
Avatar billede disky Nybegynder
26. februar 2003 - 12:38 #11
Arne_v:
Hvorfor bruger du ikke bufferedstream istedet ?
Avatar billede arne_v Ekspert
26. februar 2003 - 12:47 #12
Mit eksempel er lavet for at illustrere brugen HttpURLConnection
specielt det at den er HTTP specifik.

Resten skulle bare være så simpelt som muligt.
Avatar billede nzc Nybegynder
26. februar 2003 - 13:11 #13
arne_v du laver en komplet løsning og derfor får du lige et lille point ekstra :)

men i rigtig mange tak for de gode løsninger

NZC
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