[OFFEN] Upload Foto mit php to mysql blob

H

haner

Ambitioniertes Mitglied
0
Hallo zusammen,
ich beschäftige mich derzeit mit diesem Tutorial.
Android Upload Image Using PHP MySQL and Display Images in ListView
Leider funktioniert bei mir der Upload zur mysql-Datenbank nicht. Alles andere, wie die Wahl und Anzeige des Fotos funktioniert.

Beim Klicken des Upload-Buttons in der Apppassiert gar nichts. Rufe ich die php-Datei (http://www.techcad.bplaced.net/upload.php) im Web-Browser auf erscheint Error. Daher vermute ich den Fehler bereits bei der ersten if-Bedingung, komme aber leider nicht weiter, da meiner php-Kenntnisse noch sehr gering sind. Die mysql-Datenbank enthält die Tabelle Angebotsartikel mit der Spalte foto vom Typ blob. Würde mich über Eure Hilfe sehr freuen.
Vielen Dank schonmal.

PHP:
<?php

if($_SERVER['REQUEST_METHOD']=='POST'){
 
    $foto = $_POST["foto"];
 
    require_once('conn.php');
 
    $sql = "INSERT INTO Angebotsartikel (foto) VALUES (?)";
 
    $stmt = mysqli_prepare($Angebotsartikel,$sql);
 
    mysqli_stmt_bind_param($stmt,"s",$foto);
    mysqli_stmt_execute($stmt);
 
    $check = mysqli_stmt_affected_rows($stmt);
 
        if($check == 1){
            echo "Image Uploaded Successfully";
            }else{
                echo "Error Uploading Image";
                }
    mysqli_close($Angebotsartikel);
        }else{
            echo "Error";
        }
?>

Server-Information von bplaced.net:
  • Server: bplaced MySQL-Database Interface (Localhost via UNIX socket)
  • Server-Typ: MariaDB
  • Server Version: 5.5.33a-MariaDB - MariaDB Server
 
Hallo Haner,

wie schon in anderen Threads hier erläutert, solltest du an deinen Debug-Fähigkeiten arbeiten.
Du kannst entweder mit echo ""; oder mit printrl(); dir Sachen ausgeben.

OT: Ich finde Blobs für Bilder nicht geeignet. Normalerweise schreibe ich den Pfad in die Tabelle und lasse das Bild in einem Ordner.
 
  • Danke
Reaktionen: swa00
Auch hier das Gleiche :

am 03.01. eine Frage stellen und seit dem nie mehr online ....

So wichtig scheint es dem TE doch nicht zu sein.
 
Habe nun alles umgeschrieben, sodass ich weg von "blob" bin. Jetzt schreibt es mir den Image-Pfad in die Tabelle.
Nun habe ich das neue Problem, dass der Upload bzw. das Schreiben des Pfades beim Drücken des Buttons UploadImageServer
(android:id="@+id/btnAnghinzu) zwar stattfindet, meine anderen Inhalte (EditText-Felder) nun aber nicht mehr in die Tabelle geschrieben werden. Das Schreiben der EditText-Inhalte in die Tabelle hat zuvor funktioniert.
Komme da leider auch nach langem tüfteln nicht mehr weiter. Warum findet jetzt der Upload der EditText-Eingaben nicht mehr statt? Mit einem zweiten separaten Button für den Image-Upload funktioniert der getrennte Upload von Image und Text. Mein Ziel ist es aber, dass der Upload über einen Button möglich ist, sodass Image-Pfad und EditText-Eingaben in die gleiche Zeile der mysql-Tabelle geschrieben werden.

Hier der Code:
MainActivity.java
Code:
ImageButton SelectImageGallery;
    Button UploadImageServer;
    ImageView imageView;
    Bitmap bitmap;
    boolean check = true;

EditText artikelbezeichnung, preis_absolut, preis_relativ, geschaeft, ort, bewertung, benutzername;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_anghinzu);

        //Image
        imageView = (ImageView)findViewById(R.id.ivFoto);
        SelectImageGallery = (ImageButton)findViewById(R.id.btnChoose);
        UploadImageServer = (Button)findViewById(R.id.btnAnghinzu);


        SelectImageGallery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent();

                intent.setType("image/*");

                intent.setAction(Intent.ACTION_GET_CONTENT);

                startActivityForResult(Intent.createChooser(intent, "Select Image From Gallery"), 1);

            }
        });


        UploadImageServer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImageUploadToServerFunction();
            }
        });
    ProgressDialog progressDialog;
    String ImageName = "image_name" ;
    String ImagePath = "image_path" ;
    String ServerUploadPath ="http://www.techcad.bplaced.net/upload.php";

artikelbezeichnung =(EditText)findViewById(R.id.etArtikelbezeichnung);
        preis_absolut =(EditText)findViewById(R.id.etPreis_absolut);
        preis_relativ =(EditText)findViewById(R.id.etPreis_relativ);
        geschaeft =(EditText)findViewById(R.id.etGeschaeft);
        ort =(EditText)findViewById(R.id.etOrt);
        bewertung =(EditText)findViewById(R.id.etBewertung);
        benutzername =(EditText)findViewById(R.id.etBenutzername);
    }

//image
    @Override
    protected void onActivityResult(int RC, int RQC, Intent I) {

        super.onActivityResult(RC, RQC, I);

        if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {

            Uri uri = I.getData();

            try {

                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);

                imageView.setImageBitmap(bitmap);

            } catch (IOException e) {

                e.printStackTrace();
            }
        }
    }

    public void ImageUploadToServerFunction(){

        ByteArrayOutputStream byteArrayOutputStreamObject ;

        byteArrayOutputStreamObject = new ByteArrayOutputStream();

        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStreamObject);//Quality war ursprünlich 100

        byte[] byteArrayVar = byteArrayOutputStreamObject.toByteArray();

        final String ConvertImage = Base64.encodeToString(byteArrayVar, Base64.DEFAULT);

        class AsyncTaskUploadClass extends AsyncTask<Void,Void,String> {

            @Override
            protected void onPreExecute() {

                super.onPreExecute();

                progressDialog = ProgressDialog.show(AnghinzuActivity.this,"Image is Uploading","Please Wait",false,false);
            }

            @Override
            protected void onPostExecute(String string1) {

                super.onPostExecute(string1);

                // Dismiss the progress dialog after done uploading.
                progressDialog.dismiss();

                // Printing uploading success message coming from server on android app.
                Toast.makeText(AnghinzuActivity.this,string1,Toast.LENGTH_LONG).show();

                // Setting image as transparent after done uploading.
                imageView.setImageResource(android.R.color.transparent);


            }

            @Override
            protected String doInBackground(Void... params) {

                ImageProcessClass imageProcessClass = new ImageProcessClass();

                HashMap<String,String> HashMapParams = new HashMap<String,String>();//HashMap<String,String>()

                //HashMapParams.put(ImageName, GetImageNameEditText);

                HashMapParams.put(ImagePath, ConvertImage);

                String FinalData = imageProcessClass.ImageHttpRequest(ServerUploadPath, HashMapParams);

                return FinalData;
            }
        }
        AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new AsyncTaskUploadClass();

        AsyncTaskUploadClassOBJ.execute();
    }

    public class ImageProcessClass{

        public String ImageHttpRequest(String requestURL,HashMap<String, String> PData) {

            StringBuilder stringBuilder = new StringBuilder();

            try {

                URL url;
                HttpURLConnection httpURLConnectionObject ;
                OutputStream OutPutStream;
                BufferedWriter bufferedWriterObject ;
                BufferedReader bufferedReaderObject ;
                int RC ;

                url = new URL(requestURL);

                httpURLConnectionObject = (HttpURLConnection) url.openConnection();

                httpURLConnectionObject.setReadTimeout(19000);

                httpURLConnectionObject.setConnectTimeout(19000);

                httpURLConnectionObject.setRequestMethod("POST");

                httpURLConnectionObject.setDoInput(true);

                httpURLConnectionObject.setDoOutput(true);

                OutPutStream = httpURLConnectionObject.getOutputStream();

                bufferedWriterObject = new BufferedWriter(

                        new OutputStreamWriter(OutPutStream, "UTF-8"));

                bufferedWriterObject.write(bufferedWriterDataFN(PData));

                bufferedWriterObject.flush();

                bufferedWriterObject.close();

                OutPutStream.close();

                RC = httpURLConnectionObject.getResponseCode();

                if (RC == HttpsURLConnection.HTTP_OK) {

                    bufferedReaderObject = new BufferedReader(new InputStreamReader(httpURLConnectionObject.getInputStream()));

                    stringBuilder = new StringBuilder();

                    String RC2;

                    while ((RC2 = bufferedReaderObject.readLine()) != null){

                        stringBuilder.append(RC2);
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }

        private String bufferedWriterDataFN(HashMap<String, String> HashMapParams) throws UnsupportedEncodingException {

            StringBuilder stringBuilderObject;

            stringBuilderObject = new StringBuilder();

            for (Map.Entry<String, String> KEY : HashMapParams.entrySet()) {

                if (check)

                    check = false;
                else
                    stringBuilderObject.append("&");

                stringBuilderObject.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));

                stringBuilderObject.append("=");

                stringBuilderObject.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
            }

            return stringBuilderObject.toString();
        }

    }

public void OnAnghinzu(View view) {

        String str_artikelbezeichnung = artikelbezeichnung.getText().toString();
        String str_preis_absolut = preis_absolut.getText().toString();
        String str_preis_relativ = preis_relativ.getText().toString();
        String str_geschaeft = geschaeft.getText().toString();
        String str_ort = ort.getText().toString();
        String str_bewertung = bewertung.getText().toString();
        String str_benutzername = benutzername.getText().toString();

        String type = "anghinzu";
        BackgroundWorker backgroundWorker = new BackgroundWorker(this);
        backgroundWorker.execute(type, str_artikelbezeichnung, str_preis_absolut, str_preis_relativ, str_geschaeft, str_ort, str_bewertung, str_benutzername);

    }

activity_main.xml
Code:
<Button
            android:id="@+id/btnAnghinzu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="16dp"
            android:onClick="OnAnghinzu"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
             />

@swa00: Sorry für die etwas späte Rückmeldung. Natürlich habe ich noch Interesse an der Lösung des Problems.
 
Hallo haner,

dein Code ist schwer zu lesen, ich habe jetzt auch wirklich nicht herausgefunden, wo das ein Problem sein könnte.
Du solltest dir bei Java angewöhnen Variablen mit einem kleinen Anfangsbuchstaben zu versehen.
Eigentlich brauchst du auch nicht mehr dein Bild Base64 zu encoden.

Mein Freund hat mal für meinen Server etwas ziemlich ähnliches gebaut, was du machst.
Mein Server konnte natürlich multipart formdata abarbeiten.

Ich poste dir hier nur den Code, damit du weißt, dass es nicht so ganz einfach ist, wenn man mit Boundaries arbeiten möchte.
Code:
 String boundary = "*****";
                    String twoHyphens = "--";
                    String lineEnd = "\r\n";

                    FileInputStream fileInputStream = new FileInputStream(imageFile);
                    conn.setUseCaches(false); // Don't use a Cached Copy
                    conn.setRequestMethod("POST");
                    conn.setRequestProperty("Connection", "Keep-Alive");
                    conn.setRequestProperty("Content-Type","multipart/form-data;boundary=" + boundary);
                    conn.setRequestProperty("uploaded_file", imageFile.getName());

                    DataOutputStream dos;
                    dos = new DataOutputStream(conn.getOutputStream());
                    dos.writeBytes(twoHyphens + boundary + lineEnd);

                    //Adding Parameter uuid
                    dos.writeBytes("Content-Disposition: form-data; name=\"uuid\"" + lineEnd);
                  
                    dos.writeBytes(lineEnd);
                    dos.writeBytes(uuid); // mobile_no is String variable
                    dos.writeBytes(lineEnd);

                    dos.writeBytes(twoHyphens + boundary + lineEnd);


                    //Adding Parameter password

                    dos.writeBytes("Content-Disposition: form-data; name=\"password\"" + lineEnd);
                    dos.writeBytes(lineEnd);
                    dos.writeBytes(password); // mobile_no is String variable
                    dos.writeBytes(lineEnd);

                    dos.writeBytes(twoHyphens + boundary + lineEnd);

                    //Adding Parameter media file(audio,video and image)
                    dos.writeBytes(twoHyphens + boundary + lineEnd);

                    dos.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\""+ imageFile.getName() + "\"" + lineEnd);
                    dos.writeBytes(lineEnd);

                    int bytesRead, bytesAvailable, bufferSize;
                    byte[] buffer;
                    int maxBufferSize = 1 * 1024 * 1024;

                    // create a buffer of maximum size
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    buffer = new byte[bufferSize];
                    // read file and write it into form...
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                    while (bytesRead > 0)
                    {
                        dos.write(buffer, 0, bufferSize);
                        bytesAvailable = fileInputStream.available();
                        bufferSize = Math.min(bytesAvailable, maxBufferSize);
                        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
                    }

                    // send multipart form data necesssary after file data...
                    dos.writeBytes(lineEnd);
                    dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
 
Kann mein Problem vielleicht damit zusammenhängen, dass ich das Bild über setOnClickListener uploade und die EditText-Felder über das definierte android:onClick des Buttons?

Code:
UploadImageServer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ImageUploadToServerFunction();
            }

Code:
public void OnAnghinzu(View view) {

        String str_artikelbezeichnung = artikelbezeichnung.getText().toString();
        String str_preis_absolut = preis_absolut.getText().toString();
        String str_preis_relativ = preis_relativ.getText().toString();
        String str_geschaeft = geschaeft.getText().toString();
        String str_ort = ort.getText().toString();
        String str_bewertung = bewertung.getText().toString();
        String str_benutzername = benutzername.getText().toString();

        String type = "anghinzu";
        BackgroundWorker backgroundWorker = new BackgroundWorker(this);
        backgroundWorker.execute(type, str_artikelbezeichnung, str_preis_absolut, str_preis_relativ, str_geschaeft, str_ort, str_bewertung, str_benutzername);

    }

Code:
<Button
            android:id="@+id/btnAnghinzu"
            android:onClick="OnAnghinzu"
               />
 
Hallo,

erstmal Daumen hoch, dass dir das selber aufgefallen ist. Ich muss gestehe ich weiß es nicht. Aber ich würde mal eins von beiden raus nehmen und das dann nochmal probieren, nicht das sich durch das zweifache Anmelden des OnClickListener sich da irgendwas in die quere kommt.

Gruß Thomas
 
Danke für die Hilfe. Problem ist gelöst. Lag am zweimaligen Anmelden des OnClickListener.
 

Ähnliche Themen

B
Antworten
0
Aufrufe
684
basementmedia
B
M
Antworten
2
Aufrufe
882
manunaut
M
B
Antworten
4
Aufrufe
469
bb321
B
Zurück
Oben Unten