# Applet -> PHP = Dateien schreiben



## 8ull23y3 (13. Dez 2004)

*Problem*: Wie kann ich etwas von einem Applet aus (welches nicht signiert ist) in eine Datei schreiben?

*Meine Lösung*( mit Anregung von Bleiglanz und Grizzly   ) :

*Der Java-Quellcode von applet.class:*

```
import java.applet.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

public class schreiben
extends Applet
implements ActionListener
{
// Variablen
TextField tf;
Button bu;
// Ende Variablen

public void init() {
setLayout(new BorderLayout());
// Komponenten
tf = new TextField("");
bu = new Button("schreiben");
bu.addActionListener(this);
//Ende Komponenten
this.add(tf, BorderLayout.CENTER);
this.add(bu, BorderLayout.SOUTH);
}

// Ergeignisse
public void actionPerformed(ActionEvent aevt) {
try {
URL home = getCodeBase();
String url = home.toString()+"php.php?var1="+tf.getText();
getAppletContext().showDocument(new URL(url));
} catch(Exception x) {}
}
// Ende Ergeignisse
}
```

*Der PHP-Quellcode von php.php:*

```
<APPLET CODE="applet.class" WIDTH="600" HEIGHT="450">
<?php
$var1 = $HTTP_GET_VARS["var1"];
$datei = fopen("datei.txt", "a");
fputs($datei, $var1);
fclose($datei);
?>
```

Im obigen Applet wird -
- mit *URL home = getCodeBase();* das Verzeichnis des Applets herausgefunden.
- ein String erzeugt wo *home* in eine String geparst wird, der Name des PHP-Scripts angegeben wird, welches geladen werden soll, der Text aus dem Textfeld geholt und an die URL des PHP-Scripts angehängt.

Im PHP-Script werden die Variablen einfach mit der Methode $HTTP_GET_VARS reingeholt und könne dann weiter verarbeitet werden.

So, hoffe das hilft irgend jemandem mal weiter   

Vielen Dank nochmals an Bleiglanz und Grizzly


----------



## dotlens (14. Dez 2004)

hmmm.
wenn ich das richtig verstehe kann man das ja jetzt ausnutzen!!
der User klickt auf einen Link um das Applet runterludaden. gleichzeigtig kommt ein php.php mit runter. und sobald der user das Applet started kannst du mit der php datei alles machen was du willst ohne das Applet signieren zu lassen?!?

oder hab ich das falsch verstanden? die php datei mus jedoch lokal sein, stimmts?


----------



## 8ull23y3 (14. Dez 2004)

Versteh nicht ganz was du damit meinst... was ausnutzten?
PHP läuft nur auf Webservern wie nem Apache und ohne den kannst du auch lokal nichts machen.

Empfehle das XAMPP (Apache/MySQL/PHP/PERL) von ApacheFriends

Linux
http://prdownloads.sourceforge.net/xampp/xampp-linux-1.4.10a.tar.gz?use_mirror=kent
Windows
http://prdownloads.sourceforge.net/xampp/xampp-win32-1.4.10a-installer.exe?use_mirror=unc


----------



## Bleiglanz (14. Dez 2004)

@dotlens

nein, die php liegt auf dem Server, könnte auch ein Servlet sein; im Prinzip kanns du text im Applet editieren, dann drückst du auf Speichern

-> text wird zum server übertragen und vom php skript am server (!) ins dateisystem gelegt

für ne musterlösung würde ich das ganze aber

in einen POST packen (wegen er Längenbegrenzung beim GET)

auf die Sonderzeichen aufpassen (URLEncoder)

einen Pseudosicherheitsmechanismus einbauen (sonst ruf ich das Skript direkt auf und lege eine leere Bierflasche auf die F5-Reload taste...)


----------



## dotlens (14. Dez 2004)

ach so geht das. Danke euch beiden

coole sache 

EDIT: 
wenn jetzt jemand einen apache hat. kann man ihn dann so austricksen? wenn er das applet ausführt eine php datei runterladen. ev in temp? und diese dan ausführen? oder geht das mit dem ausführen nicht, da das file nicht auf dem localhost liegt? 

sorry. hab nicht viel ahnung von php. aber hat jetzt gleich mein intresse geweckt 

EDITEDIT:
frage zurückgezogen


----------



## Guest (14. Dez 2004)

Hi Bleiglanz das musst du mir nochmal erklären was du meinst.
Mit POST hab ichs noch nicht ausprobiert. Gib mal bittel n Beispiel!

dotlens ich versteh immernoch nicht was du vor hast.
Wie Bleiglanz schon sagt... PHP ist ne Serverseitige geschichte ohne nen Webserver der PHP unterstützt läuft auch das PHP-Script nicht. Das Applet siehst du wenns in der PHP drin steht aber mehr auch nicht.


----------



## Bleiglanz (14. Dez 2004)

mit get bist du auf 1500-2000 Zeichen beschränkt, hängt vom Browser ab

dein Applet sollte einen Post-Request zusammenbasteln und diesen an das php-Skript am Server absenden (einfach weil dann die lästige Längenbegrenzug wegfällt)

ausserdem:

wenn der Text zufällig ein "bla bla&aber=nochwas" enthält, wird was abgeschnitten 

usw. usw


----------



## Grizzly (14. Dez 2004)

Um den Schwierigkeitsgrad noch etwas zu erhöhen:

Das die Seite neu geladen wird bzw. eine andere Seite geladen wird - je nach dem - ist doch noch relativ unpraktisch. Am Besten wäre es, wenn das Applet direkt die URL ansprechen würde - also nicht über den Kontext des Applets.


----------



## 8ull23y3 (14. Dez 2004)

Das ich mit GET auf die Zeichnbeschränkung der URL stoßen kann ist mir schon klar nur wie soll ich einen POST-Request an die PHP Datei schicken? Keine Ahnung wie ich das machen könnte weil ich nicht genau weiss wie ich die Dateien in den Request verpacken soll bzw. wie der POST zum Script kommt. Hm... hoffe das verstehst du!
Hast nicht n Beispiel auf Lager? Wäre sehr nett.

Wie ist das gemeint das das Applet direkt die URL ansprechen soll? Bin ja schonmal froh das ichs überhaupt hin bekommen habe ne Datei zu schreiben.


----------



## Grizzly (15. Dez 2004)

Bspw. über eine URLConnection.  

Wenn man eine URL hat, kann man ja mit der Methode openConnection() eine Verbindung zu der URL aufbauen.
Noch besser ist natürlich eine HttpURLConnection.

Allerdings habe ich das mit einem Applet bisher noch nicht probiert. Ich weiss also nicht, was der SecurityManager dazu sagt.


----------



## 8ull23y3 (15. Dez 2004)

Puh diesess Applet Sicherheitsgeedönse geht mir mächtig auf den zwirn. Jatz kann ich nicht mal ne Socket-Verbindung zu ner anderen IP machen. Ich werd bekloppt. Von wegen ne Anwednung nur für WEB portiert. Sch... ist das. Schonwieder n Umweg u mit PHP. Krieg das Kotzen echt. Kannst du vielleicht mal Code Beispiel posten? Hab das noch nei gemacht mit URLConnection


----------



## Grizzly (16. Dez 2004)

8ull23y3 hat gesagt.:
			
		

> Kannst du vielleicht mal Code Beispiel posten? Hab das noch nei gemacht mit URLConnection


Da bist Du nicht allein. Hab' das bisher auch nur bei einem Freund gesehen.


----------



## 8ull23y3 (16. Dez 2004)

http://www.java.de/forum/message/24915/

Hab hier was gefunden. Werd versuchen mich mal damit auseinander zu setzten.
Vielleicht kanns t du ja auch mal gucken.


----------



## 8ull23y3 (16. Dez 2004)

Schau mal das hab ich sogar hier gefunden

http://www.java-forum.org/de/viewtopic.php?t=8414&highlight=connection


----------



## 8ull23y3 (22. Dez 2004)

Also auf Anregung von Illuvator sollte vielleicht erwähnt werden das das verwendete $HTTP_GET_VARS[""]; schon veraltet ist ich habs so geschrieben um sicher zu stellen das es auch mit alten PHP Versionen funktioniert die es ja immer mal geben kann.

Die Abgekürzte Version sieht folgendermaßen aus...

im PHP-Script 
	
	
	
	





```
$var1 = $HTTP_GET_VARS["var1"];
```
 in 
	
	
	
	





```
$var1 = $_GET["var1"];
```
 änder das müsst es gewesen sein. Sorry


----------



## Bleiglanz (23. Dez 2004)

noch besser ist

```
$var1 = $_GET['var1'];
```
ist ne trilliardstel sekunde schneller und etwas klarer, weil die einfachen hochkommas nicht ausgewertet werden ($xxx)


----------



## 8ull23y3 (23. Dez 2004)

Auch wieder richtig... Sorry hab nicht dran gedacht. Aber das mit der URL Connection hab ich immer noch nicht hin bekommen.


----------



## Spacerat (11. Jan 2005)

Der Security-Manager ist das Problem!

Habe das dargestellte Problem von dem Link mal ausprobiert und bekomme folgendes (mal wieder!):
java.security.AccessControlException: access denied (java.net.SocketPermission domainname.geaende.rt resolve)
Hab' schonmal wegen selbigen Problem an anderer Stelle zu kämpfen:
http://www.java-forum.org/de/viewtopic.php?t=10483

@EDIT 15.01.2005:


```
URL home = getCodeBase(); 
String url = home.toString()+"php.php?var1="+tf.getText();
```

Ich hab's grade bemerkt... In diesem Fall kann das mit der Connection warscheinlich auch deswegen nicht Klappen.

Richtig wäre:

```
URL home = getCodeBase();
String url = new URL(home, "php.php?var1="+tf.getText()).toString(); //oder besser .toExternalForm();
```

Der Fehler wird auch sehr gerne genommen, weil man ständig vergisst, das jede URL unbedingt einen Dateinamen hat (oder bekommt), so das aus "home.toString()" stets "http://top.Level.domain/verzeichnis/applet.class" wird. Den Dateinamen-Teil der URL kann man mit URL neu = new URL(URL alt, String neuerDateiname) ändern. Ein anschliessendes toString() ergibt einen unformatierten Text und toExternalForm() einen auf die im Betriebssystem verwendete Codepage abgestimmten String (oder war's URLEncoded? k.A. mal nachlesen...).


----------

