Avatar billede creationzone Nybegynder
02. juli 2004 - 20:27 Der er 13 kommentarer og
1 løsning

Gem billede på server

Hejsa

Jeg er forholdsvis ny i Java men jeg skal til at lave en billed-editor. Det er en applet hvor man kan tegne lidt, skrive lidt tekst osv. Mit problem er at man skal kunne gemme det endelige billede på min web-server, så når man er færdig kan man trykke på en knap der hedder gem, og så skal billedet gemmes på serveren.

Jeg er lidt lost i hvordan det kan gøres.. mit hovedfag er PHP så har tænkt på om man fra appletten kan kalde et PHP-script og af den vej gemme billedet, men mit problem ligger i at jeg ikke ved hvordan jeg får billedet eksporteret ud af appleten...

Håber der er nogle der kan hjælpe!
Avatar billede arne_v Ekspert
02. juli 2004 - 20:30 #1
Ja - upload med en HTTP POST til et PHP script lyder som en fornuftig måde
at gøre det på.

HTTP POST supporterer binære data, så billedet kan bare sendes uden videre.
Avatar billede creationzone Nybegynder
02. juli 2004 - 20:43 #2
Okay, men hvordan gør jeg det i java? Har arbejdet med POST-requests i C++ før, men er som sagt ny i java...
Avatar billede arne_v Ekspert
02. juli 2004 - 20:56 #3
Noget a la dette:

        URL url = new URL("http://www.domain.dk/foobar.php");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
        con.setDoOutput(true);
        con.getOutputStream().write(data);
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            ...
            is.close();
        }
        con.disconnect();
Avatar billede creationzone Nybegynder
03. juli 2004 - 17:00 #4
Jeg kunne ikke få dette til at virke 100%, har dog fundet en lidt anden måde at kalde mit script på, men det er jo bare en ting, for hvordan sender jeg billedet til serveren?

Jeg har studeret OutputStream og lidt andet men har ikke fundet ud af hvordan det skal gøres.

Jeg har dog fundet ud af at dette kan bruges til at få sendt mit billede til en OutputStream´:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(bi);

men hvordan sender jeg det til serveren, eller skal det gøres på en anden måde?
Avatar billede arne_v Ekspert
03. juli 2004 - 17:13 #5
Øh - sådan ca. som jeg skrev !

JPEGCodec.createJPEGEncoder skal bruge en OutputStream

con.getOutputStream returnerer en OutputStream
Avatar billede creationzone Nybegynder
05. juli 2004 - 00:24 #6
Jeg har nu fået hul igennem, den sender dog kun strenge af længden af 4 tegn eller noget i den stil, jeg har prøvet at gemme dem i databasen for at vise dem i en browser, men det virker ikke... Her er den kode jeg bruger, er der noget i vejen med den?

BufferedImage bi = (BufferedImage) createImage(w, h);
Graphics2D big = bi.createGraphics();

Den tegner jeg så lidt på og så skal den sendes videre...

url = new URL("http://localhost/script.php");
urlConn = url.openConnection();
urlConn.setDoInput (true);
urlConn.setDoOutput (true);
urlConn.setUseCaches (false);
urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
       
// Send POST output.
printout = new DataOutputStream (urlConn.getOutputStream ());
printout.writeBytes ("image=");
           
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(printout);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
encoder.encode(bi);           
           
//Tries to send image
printout.flush ();
printout.close ();
Avatar billede arne_v Ekspert
05. juli 2004 - 07:27 #7
Du siger at data er x-www-form-urlencoded men du URL encoder det ikke.

Hvis det skal sendes som form data, så skal du url encode det
(og undgå DataOutputStream).

Hvis det skal sendes råt, så sender du det bare råt uden nogen image=
og med application/octet-stream.
Avatar billede creationzone Nybegynder
05. juli 2004 - 12:24 #8
Okay, jeg vil gerne sende det som form data. Men hvordan urlencoder jeg det der er i den outputstream, skal jeg så ikke have det ud som en streng eller noget først?
Og hvis jeg ikke skal bruge DataOutputStream, hvad skal jeg så bruge? Har fundet et eksempel der bruger PrintWriter, er den god nok?
Avatar billede arne_v Ekspert
05. juli 2004 - 12:30 #9
urlConn.getOutputStream().write(("image=".getBytes())

burde være godt nok.
Avatar billede arne_v Ekspert
05. juli 2004 - 12:31 #10
Der er en klasse:

java.net.URLEncoder
Avatar billede creationzone Nybegynder
05. juli 2004 - 13:20 #11
Jeg kan ikke få det til at virke... Altså, jeg skal gøre 2 ting, jeg skal først udskrive "image=", og derefter skal jeg udskrive det urlencodedede billede...

Jeg har prøvet det du skrev med, urlConn.getOutputStream().write(("image=".getBytes()) men det virker ikke da serveren ikke returnere indholdet af image, jeg har prøvet at sende værdier med image... Så det skal vel skrives ud på en anden måde for at serveren forstår det...

Jeg har kigget på URLEncoder klassen, men jeg ved stadig ikke hvordan jeg URLEncoder en strøm da den klasse kun tager strenge...

Jeg fik før skrevet image= ud fint ved

printout = new DataOutputStream (urlConn.getOutputStream ());
printout.writeBytes ("image=");

Så hvilken OutputStream skal bruges til JPEGCodec.createJPEGEncoder, og hvordan urlencoder jeg dette og sender til serveren?

Det der giver mig problemer er de strømme, er ikke så meget inde i hvordan de virker i praksis...
Avatar billede arne_v Ekspert
05. juli 2004 - 13:26 #12
Jeg bliver nok nødt til at lave et komplet eksempel.

Jeg prøver at kigge på det i aften.
Avatar billede arne_v Ekspert
06. juli 2004 - 22:17 #13
Jeg tror ikke på form data. Problemer med nul bytes og diverse andre non printable
karakterer.

Rå er derimod lige ud af landevejen.

Her kommer et eksempel.

RawPost.java:

import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.image.*;

import com.sun.image.codec.jpeg.*;

public class RawPost {
  public static void main(String[] args) {
      try {
        URL url = new URL("http://localhost/rawpost.php");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "image/jpeg");
        con.setDoOutput(true);
        BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        Graphics g = bi.getGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, 100, 100);
        g.setColor(Color.BLUE);
        g.fillOval(20, 20, 60, 60);
        JPEGImageEncoder ecd = JPEGCodec.createJPEGEncoder(con.getOutputStream());
        ecd.encode(bi);
        con.connect();
        if(con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream is = con.getInputStream();
            byte[] b = new byte[1000];
            int n;
            while((n = is.read(b)) >= 0) {
              System.out.println(new String(b,0,n));
            }
            is.close();
        } else {
            System.out.println(con.getResponseCode() + " " + con.getResponseMessage());
        }
        con.disconnect();
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (ImageFormatException e) {
        e.printStackTrace();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

rawpost.php:

<?php
$f = fopen("C:\\z.jpg", "wb");
fwrite($f, $HTTP_RAW_POST_DATA);
fclose($f);
?>
OK

Billedet er ikke det mest sofistikerede men det regne rjeg med at du har styr på.

PHP scriptet skriver bare ud til en fil. Du kan også gemme i en database
i stedetfor.

Der er også et alternativ til $HTTP_RAW_POST_DATA, men den virker hos mig.
Avatar billede creationzone Nybegynder
07. juli 2004 - 16:58 #14
Jo tak, det var lige det jeg havde brug for.. det virker også fint hos mig, og det med billedet har jeg styr på...

Takker!
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