[Java] Bild-Datei per POST an PHP-Script schicken

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Nanobyte, 25. Mai 2010 .

  1. 25. Mai 2010
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Bild-Datei per POST an PHP-Script schicken

    Moin,

    Zuerst: Ich bin ein absoluter Anfänger in Java, ich bin noch dabei Galileo Computing :: Java ist auch eine Insel zu lesen!


    Ich möchte mit Java auf einem Android OS eine Bild-Datei per POST an ein PHP-Script schicken.

    Die Datei lässt sich sowohl lesen als auch Verschicken, allerdings scheint die Zeichenkodierung nicht Korrekt zu sein!

    (Links: Formular Upload. Rechts: Upload über Android APP)
    Bild

    SourceCode
    Spoiler
    Code:
    package com.android.nanobyte.postsender;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    
    
    
    public class PostSender extends Activity {
     /** Called when the activity is first created. */
     
     
     
     protected void alertbox(String title, String mymessage)
     {
     new AlertDialog.Builder(this)
     .setMessage(mymessage)
     .setTitle(title)
     .setCancelable(true)
     .setNeutralButton(android.R.string.cancel,
     new DialogInterface.OnClickListener() {
     public void onClick(DialogInterface dialog, int whichButton){}
     })
     .show();
     }
    
    
     
     
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     
     DataOutputStream dos = null; 
    
     
     
     try {
     
     // Datei zum verschicken laden
     String fileName = "/sdcard/download/natur.jpg";
     File fl=new File(fileName);
     if(!fl.exists()) {
     alertbox("Fehler", "Datei wurde nicht gefunden!");
     }
     
     //String fileStream = readFileAsString(fileName);
     
     
     String agent = "Android 2.1 Uploader";
     
     String BONDARYSTRING = "----WebKitFormBoundarynx4g7AR1BWnBezIS";
     String lineEnd = "\r\n";
     String twoHyphens = "--";
     
     // Send data
     URL url = new URL("http://xXxXxXxXxXxXxXxXxXxXxX/versuchslabor/php/android/file-upload/index.php");
     HttpURLConnection conn = (HttpURLConnection) url.openConnection();
     conn.setRequestMethod("POST");
     conn.setDoOutput(true);
     conn.setDoInput(true);
     conn.setUseCaches(false);
     conn.setRequestProperty( "User-Agent", agent );
     conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BONDARYSTRING);
     
     dos = new DataOutputStream( conn.getOutputStream() );
     dos.writeBytes(twoHyphens+BONDARYSTRING+lineEnd); // Start Trenner
     dos.writeBytes("Content-Disposition: form-data; name=\"image\"; filename=\"dog.jpg\""+lineEnd);
     dos.writeBytes("Content-Type: image/jpeg"+lineEnd+lineEnd); // Datei-Type
     
     StringBuffer fileContent = ReadStringFromFile(fileName);
     
     dos.writeBytes(fileContent.toString());
    
     dos.writeBytes(lineEnd); // Neue Zeile
     dos.writeBytes(twoHyphens+BONDARYSTRING+lineEnd); // Zwischentrenner
     dos.writeBytes("Content-Disposition: form-data; name=\"title\""+lineEnd+lineEnd);
     dos.writeBytes("Sending from Android"); // Inhalt
     dos.writeBytes(lineEnd); // Neue Zeile
     dos.writeBytes(twoHyphens+BONDARYSTRING+twoHyphens+lineEnd); // Wichtig, letzter Trenner mit twoHyphens
     
     dos.flush(); // Abschicken
     
     
     // Get the response
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
     String line;
     while ((line = rd.readLine()) != null) {
     // Process line...
     }
     rd.close();
     
     dos.close();
    
     } catch (Exception e) {
     }
     }
    
    
    
    
    
     public StringBuffer ReadStringFromFile(String fileName) {
     //create file object
     File file = new File(fileName);
     
     int ch;
     StringBuffer strContent = new StringBuffer("");
     FileReader fin = null;
     
     try
     {
     /*
     * Create new FileInputStream object. Constructor of FileInputStream throws
     * FileNotFoundException if the agrument File does not exist.
     */
     
     fin = new FileReader(file);
     
     /*
     * To read bytes from stream use,
     * int read() method of FileInputStream class.
     *
     * This method reads a byte from stream. This method returns next byte of data
     * from file or -1 if the end of the file is reached.
     *
     * Read method throws IOException in case of any IO errors.
     */
     
     while( (ch = fin.read()) != -1)
     strContent.append((char)ch);
     
     /*
     * To close the FileInputStream, use
     * void close() method of FileInputStream class.
     *
     * close method also throws IOException.
     */
     fin.close(); 
     
     }
     catch(FileNotFoundException e)
     {
     System.out.println("File " + file.getAbsolutePath() + 
     " could not be found on filesystem");
     }
     catch(IOException ioe)
     {
     System.out.println("Exception while reading the file" + ioe);
     }
     
     //System.out.println("File contents :");
     // System.out.println(strContent);
     return strContent;
     }
    }


    Ich hoffe ihr könnt mir helfen das Problem zu lösen!

    mfg Nanobyte
     
  2. 25. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    offensichtlich hast du ein Problem mit dem Zeilenumbruch. Dies ist Plattform bedingt, (meines wissesn z.B. unter windows \r\n, Linux nur \n oder so in der art). Du machst diese statisch, indem du in einen String den Linefeed reingepackt hast, warum? Java ist fähig den Zeilenumbruch der ausführenden Plattform auszulesen (System.getProperty("line.separator") . Was die sonstigen, fehlenden Steuerzeichen angeht, kann man nur mutmassen, dass ein Problem mit der Codierung vorliegt, so ala auf deiner Maschine UTF-8 und auf dem Server ISO-8859 oder so.

    Schau mal ob du da was findest.

    mfg swissmaster
     
  3. 25. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    @Nanobyte

    Binärdatei – Wikipedia

    Eine binär Datei (jpg, exe, avi, mpg, dll, zip, rar, usw.) öffnet man niemals mit einem Texteditor! Google -> Hexeditor

    Eine binär Datei (jpg, exe, avi, mpg, dll, zip, rar, usw.) liest man niemals als String ein oder wandelt es in einen String um, der einzige Datentyp den man da benutzen darf ist "byte" bzw. in manchen Programmiersprachen auch "unsigned char" genannt!

    Ich möchte das du diese 2 Sätze auswendig lernst und verinnerlichst, die gelten für alle Programmiersprachen...

    Todsünde:
    StringBuffer fileContent = ReadStringFromFile(fileName);

    Möglichkeit:
    File theFile = new File("C:\\t.jpg");
    byte[] data = new byte[(int) theFile.length()];
    DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(theFile)));
    fis.readFully(data);
     
  4. 26. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    du magst zwar recht haben, aber laut rfc trennt man header immer mit \r\n egal auf welcher plattform.
     
  5. 28. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    Tut mir leid das ich mich nicht mehr gemeldet hab :/

    Ich hab das Problem leider bisher noch nicht lösen können aber dafür mein erstes Android FTP App in Java geschrieben.

    Wenn noch jemand eine Lösung hat wie man eine Datei per POST alá HTML Formular-Upload machen kann dann bitte immer her damit
     
  6. 28. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    Die Lösung hab ich dir schon genannt und dann anstatt dos.writeBytes einfach dos.write...
     
  7. 29. Mai 2010
    AW: Bild-Datei per POST an PHP-Script schicken

    Stimmt du hast recht, es funktioniert

    Ich hab wohl vor 4 Tagen ein Brett vor dem Kopf gehabt, vielen Danke!
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.