# Einfachste Möglichkeit online zu speichern?



## Arp (10. Aug 2010)

Hallo,

Ich habe grade ein Programm geschrieben, eine Art GeldTagebuch. Nun will ich das später sowohl zuhause, als auch im Büro nutzen (und noch später irgendwann auf meinem Handy). Dafür würde es sich aber natürlich anbieten das online zu speichern. Ich hab eine All-inkl. Domain. Mein erster Gedanke war einfach per FTP die nötigen Dateien in einen Ordner zu speichern. Aber soweit ich weiss ist vom Büro aus kein FTP transfer möglich weil unser Netz sowas blockiert. Zumindest aus dem Netzwerk raus.
Welche anderen Möglichkeiten gäbe es online zu speichern? Kann ich per HTTP was auf einem Online Ordner speichern? Ich hab noch nie irgendwas in Richtung Netzwerk gemacht....

thx.


----------



## MAltendeitering (10. Aug 2010)

Hi Arp,

meines Wissens nach kannst du mit HTTP nichts speichern, sondern nur aus dem netzwerk lesen bzw. Informationen beziehen. Eine Möglichkeit die mir spontan einfallen würde wäre, dass du dir zwei kleine Programme schreibst, die über Sockets kommunizieren. Wobei du dann einen Port wählen müsstest der bei euch nicht blockiert ist. Das kleine Server Programm, welches dann auf deinem Webserver läuft könnte dann die Informationen senden bzw. speichern.


----------



## Ullenboom (10. Aug 2010)

Mit HTTP kannst du gut speichern (POST, PUT), und es gibt ganze Dateisysteme dafür, siehe WebDAV. Serverseitig muss natürlich ein Datastore sitzen was die Daten annimmt, egal ob REST, WebDAV, ...

Eine ganz andere Idee ist folgende: Vielleicht darfst du DropBox installieren. Dann kann dein Java-Programm auf den DropBox Ordner zugreifen und das wird automatisch mit der Clound und allen Rechern synchronisiert.

Grüße

 Christian


----------



## MAltendeitering (10. Aug 2010)

> Mit HTTP kannst du gut speichern (POST, PUT), und es gibt ganze Dateisysteme dafür, siehe WebDAV.



ok gut zu Wissen, war mir bisher gar nicht bekannt. Hatte ich aber auch noch nie benutzt.


----------



## Arp (11. Aug 2010)

Hi!

Ich hab jetzt eine einfache Möglichkeit gefunden online zu lesen.


```
URL url = null;
InputStream is= null;
DataInputStream input = null;
String zeile = "";
url = new URL("http://Beispielseite/test.dat");
is = url.openStream();
input = new DataInputStream(new BufferedInputStream(is));		
while((zeile=input.readLine())!=null)
{
   System.out.println(zeile);
}
[/JAva]

Das listet den Inhalt der Datei auf, genau das was ich haben will.

Aber scheinbar geht das mit dem schreiben nicht so einfach. Ich hatte probiert einfach einen OutputStream zu definieren und dann auch mit openStream() zu arbeiten. Aber das öffnet wohl ausschließlich einen InputStream.

Habt ihr da ein beispiel an das ich mich halten könnte?
```


----------



## Arp (11. Aug 2010)

Ich hab noch ein Schreibbeispiel gefunden.


```
url = new URL("http://beispielseite/test.dat");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
HttpCon.setDoOutput(true);
httpCon.setRequestMethod("PUT");
OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());
out.write("Testzeile");
out.flush();
out.close();
```

Es liefert zwar keine fehler (ich fange exceptions ab), aber die Datei bleibt auf dem Server unverändert. Kann es sein das meine Domain das irgendwie blockiert?


----------



## XHelp (11. Aug 2010)

Also 
	
	
	
	





```
POST
```
 speichert schon mal gar nichts. Es übermittelt nur Daten an eine Datei (kann ja php script sein, der die Daten dann speichert).

```
PUT
```
 würde ich auch auf keinen Fall benutzen. Ich denke auch, dass PUT bei den meisten Servern deaktiviert ist (stichwort Sicherheit)

[EDIT]
Zu der ursprünglichen Frage: du könntest du auch überlegen eine Datenbank zu benutzen. Falls du beim Handy dann probleme bekommst, dann könntest du auch online einen php-script ablegen, der für die die Datenbank anspricht und dir die Daten z.B. als XML rausgibt.
[/EDIT]


----------



## Arp (12. Aug 2010)

Hmm, ich merk schon... upload ist nicht so einfach....

Ich hab auch leider noch kaum mit php erfahrung. Wie muss denne ine php datei aussehen die über POST anspreche?


----------



## XHelp (12. Aug 2010)

Die Informationen sind in 
	
	
	
	





```
$_FILES
```
, google einfach mal nach "php upload", dann sind bestimmt Beispiele mit Erklärungen dabei.


----------



## Arp (12. Aug 2010)

Hmmm... ich finde nur beispiele für das uploaden aus einem html formular. und nichtmal das funktioniert. Aber ich will ja eigentlich auch kein Formular haben sondern direkt aus dem Programm hochladen.

btw: kann es sein das all-inkl. vll gar keinen http upload unterstützt? Das würde erklären warum die html/php beispiele nicht funktionieren.


----------



## XHelp (12. Aug 2010)

Naja, es gibt keine "http upload". Du schickst einfach Daten über POST rüber.
Du kannst ja php script übernehmen, der Formulardaten auswertet und aus der Java anwendung die Daten schicken.
D.h. bei php brauchst du sowas: PHP: Handling file uploads - Manual (da gibt es auch fertigen Code dazu)
und bei java such mal nach "java post file upload" (stichwort "multipart post").
Falls du nicht vorankommst, kannst du natürlich hier den Code reinstellen, damit der Fehler gefunden werden kann.


----------



## Empire Phoenix (12. Aug 2010)

Ist eher unwahrscheinlich, da auf die selbe methode meistens auch sachen wie der text hier den ich gerade schreibe an das forum übermittelt werden. Hast du die Log datei von php evtl findest du dann den fehler.

Ansonsten könntest du einen free datenbank hoster suchen, (gibt es einige), oder ein netzwerkspeicher dienst testen.

Im allgemeinen solltest du jedoch sofort daran denken, das alles was du online hast von belibigen Leuten angesprochen werden kann, und die daten ausgelesen, wenn du die übertragung nicht verschlüsselt ausführst.

Am Rande, das formular hat insofern was damit zu tun, das es einen Post request an eine php(kann auch was anderes cgi fähiges sein) schickt und diese den dann bearbeitet. Selbigen post request kannst du auch direct aus java generieren.


----------



## XHelp (12. Aug 2010)

Empire Phoenix hat gesagt.:


> Im allgemeinen solltest du jedoch sofort daran denken, das alles was du online hast von belibigen Leuten angesprochen werden kann, und die daten ausgelesen, wenn du die übertragung nicht verschlüsselt ausführst.


Falsch. Man kann sich ja auch vorher authentifizieren. Ist ja das gleiche wie im Forum. Die Daten werden da doch auch nicht verschlüsselt (idR), aber ohne das Kennwort kommst du an die privaten Nachrichten anderer nicht ran (von Admins mal abgesehen)
[EDIT]Aber der Hinweis ist ganz wichtig: denk an die Sicherheit[/EDIT]


----------



## Arp (12. Aug 2010)

Hi!

Ich kann grad die php und die htm datei nicht vom server laden weil ich aus der uni keinen ftp zugriff hab (bzw. zu blöd bin bei FileZilla den Proxy richtig einzustellen ), aber ich bin mir zu 99% sicher das ich das hier gemacht hab:

htm datei upload.htm:


```
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="datei"><br>
<input type="submit" value="Hochladen">
</form>
```

und die zugehörige php upload.php

<?php
move_uploaded_file($_FILES['datei']['tmp_name'], "datei.txt");
?> 


mir ist klar das diese php nun alles von überall zulässt, aber es soll ja nur ein test sein. Hab das von einer php tutorial seite so kopiert. und das klappt nicht. ich kann zwar die htm sehen und auch eine datei zum upload auswählen, aber nach dem drücken des buttons gibt es keine neue datei im ordner.


----------



## r.w. (12. Aug 2010)

Hallo Arp,

ich stand vor einiger Zeit vor einer ähnlichen Aufgabe. Da es sich bei mir
in diesem Fall um einen Intranet-Server handelte und keine sensiblen
Daten hochgeladen werden sollten, war eine Verschlüsselung hier nicht 
erforderlich.

Eine einfache Kennwort-Authentifizierung (wie z.B. in diesem Forum) allein, 
reicht übrigens nicht aus um die Übertragung 100%-ig abzusichern. Denn
die Zugangsdaten werden bei unverschüsselter Verbindung in der Regel im
Klartext durch das Netz geschickt. Hat jemand Zugriff auf den Datenstrom,
könnte er mit geeigneter Software (im Internet zu erhalten) diesen mitschneiden.



Hier eine kurze Beschreibung meiner Lösung (ohne Authentifizierung und Verschlüsselung):


Serverseitige Voraussetzungen sind natürlich, dass ...
 1.   ... Du auf dem Server die Berechtigung hast, eigene PHP-Skripte auszuführen.
 2.   ... das PHP-Skript über die Schreibberechtigung im Zielverzeichnis auf dem Server verfügt.

Außerdem können Einschränkungen, die in der php.ini des Servers definiert sind, bei größeren Dateien 
zum Abbruch des Uploads führen. Oft ist z.B. die maximale Dateigröße für den Upload auf 2MB beschränkt.
Auch wird oft ein Timeout ausgelöst, wenn der Upload zu lange dauert. Default sind meist 60 Sekunden.
Hier kann nur der zuständige Admin helfen.

So nuaba: ;-)

Die folgende PHP-Datei unter dem Namen 'uploadDocument.php' auf dem Server ablegen. 


```
<?php
		define('CNF_UPLOAD_DIR', '/DeinZielverzeichnisAufDemServer');

		$fnOrig = $_FILES['DATEI']['name'];
		$fnTemp = $_FILES['DATEI']['tmp_name'];
		
		echo $fnOrig . "<br>\r\n";
		echo $fnTemp . "<br>\r\n";
		
		move_uploaded_file($fnTemp, CNF_UPLOAD_DIR . "/" . $fnOrig);
?>
```
TODO: '/DeinZielverzeichnisAufDemServer' durch den gewünschten Server seitigen Zielpfad ersetzen.
Zu "$_FILES['DATEI']": Der Feldname "DATEI" ist frei wählbar und muss mit dem 1. Parameter der 
des Aufrufs von 'out.writeFile("DATEI", strContentType, new File(fnFile2Upload));' übereinstimmen.


Die Klasse 'MultiPartFormOutputStream' und eine Anleitung dazu hab ich damals hier gefunden:
Java Programming [Archive] - Useful Code of the Day: Multipart Form File Upload



```
// benoetigte Imports ----------
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
// -----------------------------


    public void UploadFile(String strURL, String ContentType, String strDstFilename, String fnFile2Upload) {
        try {
            String strContentType = ContentType; // Beispiel. "text/plain";
            URL url = new URL(strURL);

            // Trennzeichenkette erzeugen
            String boundary = MultiPartFormOutputStream.createBoundary();
            URLConnection urlConn = MultiPartFormOutputStream.createConnection(url);
            urlConn.setRequestProperty("Accept", "*/*");
            urlConn.setRequestProperty("Content-Type", MultiPartFormOutputStream.getContentType(boundary));
            
            // Request Header setzen...
            urlConn.setRequestProperty("Connection", "Keep-Alive");
            urlConn.setRequestProperty("Cache-Control", "no-cache");

            // connect() braucht nicht explizit aufgerufen zu werden,
            // da getOutputStream() dies erledigt
            MultiPartFormOutputStream out = new MultiPartFormOutputStream(urlConn.getOutputStream(), boundary);
            
            // Beispiel fuer ein TextField-Element
            // "TEXTFELD" entspricht dem Namen des uebertragenen Feldes
            // out.writeField("TEXTFELD", "text field text");
            
            // Datei-Upload
            strContentType = MultiPartFormOutputStream.getContentType(boundary);
            //   "DATEI" in der folgenden Zeile entspricht dem Namen des uebertragenen Feldes im PHP-Skript
            out.writeFile("DATEI", strContentType, new File(fnFile2Upload));

            out.close();
            
            // Antwort des Servers auslesen und ausgeben
            BufferedReader in = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
            String line = "";
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
        } catch (MalformedURLException ex) {
            System.out.println(ex.getMessage());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }

    }
```

Aufgerufen wird die Funktion wie folgt:

```
UploadFile("http://www.DeineHomepage.de/uploadDocument.php", "application/pdf", "Zieldateiname.pdf", "/Quellfad/Quelldateiname.pdf");
```
TODO: Content-Type (hier "application/pdf") und der "Zieldateiname" müssen angepasst werden,
      ebenso die Quelle ("/Quellfad/Quelldateiname.pdf") der Datei auf dem lokalen Rechner und natürlich der Domain-Name.
     Unter Windows muss der absolute Quellpfad entsprechend angepasst werden (Laufwerk: ).


Da ich den Text in einem einfachen Text-Editor zusammenkopiert hab, garantiere ich keine Fehlerfreiheit und erhebe auch keinen Anspruch auf Vollständigkeit.
Ich hoffe, ich hab mich nicht zu umständlich ausgedrückt und Ihr könnt etwas damit anfangen. 
Viel Spass beim Ausprobieren. ;-)

VG ROlf


----------



## Arp (12. Aug 2010)

Hallo Rolf,

Danke für die Mühe. Ich brauchte erstmal die Klasse MultiPartFormOutputStream. Dann gabs noch einen fehler:

```
MultiPartFormOutputStream out = new MultiPartFormOutputStream(urlConn.getOutputStream(), boundary, this);
```

Das hat der nicht genommen, erst wenn ich das "this" gelöscht hab.

Nun kommt aber nur "connection reset" als Meldung.

schon gut, ich hatte ein .de zu viel 

aber nun kommt folgendes:

<b>Warning</b>:  move_uploaded_file(//test.txt) [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: failed to open stream: Permission denied in <b>/.../uploadDocument.php</b> on line <b>10</b><br />
<br />
<b>Warning</b>:  move_uploaded_file() [<a href='function.move-uploaded-file'>function.move-uploaded-file</a>]: Unable to move '/tmp/phpzbEuvv' to '//test.txt' in <b>/.../uploadDocument.php</b> on line <b>10</b><br />


Also doch fehlende berechtigungen?

Ich hab zumindest in filezilla (hab den zugang hinbekommen ) dem ordner ne 777 verpasst.


----------



## XHelp (12. Aug 2010)

also "//test.txt" ist ja auch keine Pfadangabe. Der Pfad muss auch nicht absolut sein. Hast du auch daran gedacht Schreibrechte bei FTP für das Verzeichnis zu setzen?


----------



## Arp (12. Aug 2010)

Naja, //test.txt hab ich auch nirgends geschrieben. In der PHP steht define('CNF_UPLOAD_DIR', '/upload');
und in der java steht
UploadFile("http://www.DeineHomepage.de/uploadDocument.php", "text/plain", "test.txt", "test.txt");
(mit anderer domain natürlich)
die test.txt datei ist auch im richtigen, sie wird ja gefunden. Warum die PHP antwort nun //test.txt sagt ist mir schleierhaft.

Was meinst du mit schreibrechten bei FTP?


----------



## XHelp (12. Aug 2010)

@FTP, das was mit 777 gemacht hast.
Ich bin mir ziemlich sicher, dass du auch /upload keinen zugriff hast.
Zeige mal deinen php script so wie er bei dir steht


----------



## Arp (12. Aug 2010)

Ich hab die berechtigungen in FileZilla gesetzt. Ich weiss aber nicht ob das nur fürs FTP Protokoll gilt, oder für alles.

php:

<?php
        define('CNF_UPLOAD_DIR', '/upload');
        $fnOrig = $_FILES['DATEI']['name'];
        $fnTemp = $_FILES['DATEI']['tmp_name'];
        echo $fnOrig . "<br>\r\n";
        echo $fnTemp . "<br>\r\n";
        move_uploaded_file($fnTemp, CNF_UPLOAD_DIR . "/" . $fnOrig);
?>


----------



## XHelp (12. Aug 2010)

erstelle in dem Verzeichnis, wo die php Datei liegt einen Ordner "upload", gib ihm schreibrechte und lösche den anfangsslash von CNF_UPLOAD_DIR


----------



## Arp (12. Aug 2010)

Hi!

Wunderbar! Das schien wirklich an diesem Slash zu liegen. Die Datei wird jetzt übertragen. Vielen Dank!


----------



## Arp (12. Aug 2010)

Ich nerv jetzt auch zum letzten mal, versprochen 
Aber ist es schwer da eine user/pw abfrage einzubauen? Ich hab es nämlich grad geschafft per FTP hochzuladen was eigentlich sicherer sein sollte. Dabei hab ich bislang aber noch zwei kleine Probleme. Ich will das programm demnächst auch auf Windows Mobile (auf meinem HTC) laufen lassen und ich weiss nicht ob es da auch ftp transfers gibt, und zweitens krieg ich das mit einem Proxy noch nicht hin. Immer wenn ich einen nutze, läuft das programm und hört nicht auf und tut scheinbar nichts.

Wär es also relativ einfach eine user/pw abfrage, oder sonst einen kleinen sicherheitsmechanismus einzubauen? Denn jetzt ist es ja so, das theoretisch jeder über die upload php alles hochladen kann und weil der ordner ne 777 hat, darin dann auch alles ausführen kann.


----------



## XHelp (12. Aug 2010)

Also die Rechte zum Ausführen kannst du ja auch nehmen. Außerdem kannst du auf einem kostenlosem Hosting nicht viel ausführen.
Schick doch nicht nur die Daten, sondern noch ein feld "password" mit, und bevor du die Arbeit mit der Datei beginnst, überprüfe das Kennwort. Wenn es stimmt, dann kopiere die Datei, ansonsten mach nichts.
[EDIT]Was du mit einem Proxy willst, ist mir allerdings ein Rätsel[/EDIT]


----------



## Arp (12. Aug 2010)

achso, das ist so einfach?

also in der php sowas wie
$fnOrig = $_FILES['DATEI']['name']['pw'];
if pw = "pw"                                                   wobei ich hier die syntax noch nicht kenne.
{$fnTemp = $_FILES['DATEI']['tmp_name'];
echo $fnOrig . "<br>\r\n";
echo $fnTemp . "<br>\r\n";
move_uploaded_file($fnTemp, CNF_UPLOAD_DIR . "/" . $fnOrig);}

und in java dann
UploadFile("http://www.DeineHomepage.de/uploadDocument.php", "text/plain", "test.txt", "test.txt","pw")

so in der art?


----------



## XHelp (12. Aug 2010)

```
if ($_POST['pw']=="bla") {
  //machwas
}
```


----------



## Arp (12. Aug 2010)

Hmm, also prinzipiell funktioniert das jetzt. Wenn ich ein pw feld setze und in der php abfrage ob das da steht, dann wird die datei nur angelegt wenn das pw stimmt. Nun hab ich aber das problem, das die datei zwar dann, und nur dann, angelegt wird, aber der name stimmt nicht. Statt test.txt wird eine datei namens t angelegt. Der inhalt stimmt zwar, aber der name nicht.

die php:

```
<?php
        define('CNF_UPLOAD_DIR', 'data');
 
        $fnOrig = $_FILES['DATEI']['name']['pw'];
	if($_POST['pw']=="bla")
	{        
		$fnTemp = $_FILES['DATEI']['tmp_name'];
	        echo 'uploaded';
	        move_uploaded_file($fnTemp, CNF_UPLOAD_DIR . "/" . $fnOrig);
	}
?>
```

ich bin mir nicht sicher ob es richtig war, aber damit das klappt hab ich in rolfs code etwas geändert.
undzwar hab ich aus seiner Zeile 34 folgendes gemacht:


```
out.writeField("pw", pw);
```

hab ich irgendwo was falsch gemacht?


----------



## Arp (12. Aug 2010)

Schon gut 

der Fehler war wohl das hinzufügen des ['pw'] feldes bei $fnOrig. Ohne funktioniert es.

Ich danke euch für die Hilfe!


----------



## r.w. (13. Aug 2010)

Hallo Arp,



Arp hat gesagt.:


> Hallo Rolf,
> 
> Danke für die Mühe. Ich brauchte erstmal die Klasse MultiPartFormOutputStream. Dann gabs noch einen fehler:
> 
> ...



sorry, den hatte ich vergessen zu erklären. ;-)

Ich hatte für mich damals noch einen Listener in die Klasse implementiert, um beim Upload einen Statusbalken anzeigen zu können.
Für dieses Beispiel hab ich jetzt in meinem ersten Posting einen Link zur Originalklasse eingefügt und den entsprechenden Parameter ('this') entfernt. 

Danke für die Info,

VG ROlf


----------

