VolleyMultipartRequest

wer112

Top Contributor
Guten Tag, liebes Java Forum,
in diesem Post geht es um die erweiterte Klasse VollyMultiparRequest -> https://www.maxester.com/blog/2019/10/04/upload-file-image-to-the-server-using-volley-in-android/

Ich möchte wie dort eine Datei hochladen, aber eine Zip.

Da habe ich folgende Probleme:

1. Ich kann DataPart in der getByteData Methode nicht importieren, obwohl es anzeigt.
2. Wie kann ich da meine Zip ranhängen? Brauche ich da sonst noch was(Pfad,..?)


Habe das versucht:

Java:
        //Upload URL
        String upload_url = "";
        
        RequestQueue queue = Volley.newRequestQueue(getActivity());

        VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST, upload_url, new Response.Listener<NetworkResponse>() {
            @Override
            public void onResponse(NetworkResponse response) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        }){

            @Override
            protected Map<String, VolleyMultipartRequest.[B]DataPart[/B]> getByteData() throws AuthFailureError {
                Map<String, [B]DataPart[/B]> params = new HashMap<>();
                params.put("application/zip", new DataPart("E"+ kundennummer +".zip", ))
                return params;
            }
        };

        queue.add(volleyMultipartRequest);

Wenn das Upload erfolgreich war, soll es über den normalen StringRequest das Zip Archive Passwort und das Formular übergeben werden.

Ich hoffe Ihr wisst, wieso man es nicht importieren kann, obwohl es anzeigt zum importieren.

Ich hoffe ihr kennt sich ein Wenig damit aus.

Ich wünsche euch einen schönen Mittwoch.

Ich danke euch im Vorraus.
 

Jw456

Top Contributor
Schaue dir doch mal das Tutorial was dir in einem vorherigen Thread gegeben wurde mal richtig an.

Schaue doch mal wo in welchem Package der Datentyp (Klasse) DataPart definiert ist.
Bestimmt nicht in deiner Klasse VolleyMultipartRequest.

Überlege mal was ein import macht. Oder was du nach einem Import nicht mehr schreiben musst. "FQFN"
 

wer112

Top Contributor
Schaue dir doch mal das Tutorial was dir in einem vorherigen Thread gegeben wurde mal richtig an.

Schaue doch mal wo in welchem Package der Datentyp (Klasse) DataPart definiert ist.
Bestimmt nicht in deiner Klasse VolleyMultipartRequest.
Dort steht das in der VollyMultipartRequest java:
Java:
  class DataPart {
        private String fileName;
        private byte[] content;
        private String type;

        public DataPart() {
        }

        DataPart(String name, byte[] data) {
            fileName = name;
            content = data;
        }

        String getFileName() {
            return fileName;
        }

        byte[] getContent() {
            return content;
        }

        String getType() {
            return type;
        }

    }
Überlege mal was ein import macht. Oder was du nach einem Import nicht mehr schreiben musst. "FQFN"
Das man Methoden oder Klassen importiert und somit Variablen und dessen Werte übernimmt.
Das geht wenn es Public ist.

Da das nicht public war, habe ich laut AS es public gemacht, so:
Java:
public class DataPart {
        private String fileName;
        private byte[] content;
        private String type;

        public DataPart() {
        }

        public DataPart(String name, byte[] data) {
            fileName = name;
            content = data;
        }

        String getFileName() {
            return fileName;
        }

        byte[] getContent() {
            return content;
        }

        String getType() {
            return type;
        }

    }

Ich weiß nicht ob ich das so machen muss, schließlich hat ja der Entwickler nicht ohne Grund es NICHT public gemacht.
 

KonradN

Super-Moderator
Mitarbeiter
Im Augenblick habe ich Probleme, zu verstehen, was Du da genau machst.

Du hast da ein Code Beispiel gefunden für ein VolleyMultipartRequest. Hast Du da jetzt nur die innere Klasse DataPart genommen und glaubst, damit kannst Du dann die Params setzen und das funktioniert auf magische Weise?
Zumal dein Code aus #1 nicht einmal übersetzt, da die Zeile
params.put("application/zip", new DataPart("E"+ kundennummer +".zip", ))
keine gültige Syntax hat.

DataPart ist eine innere Klasse, die vor allem von der äußeren Klasse verwendet wird. Man kann da überlegen, dass man das generischer macht und dann DataPart tatsächlich public macht, aber da würde ich dann auch eher anders vorgehen.

Du kannst die Klasse aus dem Post 1:1 nutzen. Überschreib nur die Methode:
Java:
    /**
     * Custom method handle data payload.
     *
     * @return Map data part label with data byte
     * @throws AuthFailureError
     */
    protected Map<String, DataPart> getByteData() throws AuthFailureError {
        return null;
    }

Und da musst Du dann natürlich die DataPart Instanzen korrekt bauen mit dem Dateinamen und dem Content.
 

Jw456

Top Contributor
Java:
protected Map<String, VolleyMultipartRequest.[B]DataPart[/B]> getByteData() throws AuthFailureError {
// ohne VolleyMultipartRequest und ohne dem [B] 
So wie im dem Beispiel auch.
 

wer112

Top Contributor
Im Augenblick habe ich Probleme, zu verstehen, was Du da genau machst.

Du hast da ein Code Beispiel gefunden für ein VolleyMultipartRequest. Hast Du da jetzt nur die innere Klasse DataPart genommen und glaubst, damit kannst Du dann die Params setzen und das funktioniert auf magische Weise?
Zumal dein Code aus #1 nicht einmal übersetzt, da die Zeile
params.put("application/zip", new DataPart("E"+ kundennummer +".zip", ))
keine gültige Syntax hat.
Habe es so gemacht:
Java:
params.put("E"+ kundennummer +".zip", new DataPart("E"+ kundennummer +".zip", (Environment.getExternalStorageDirectory() + "/Download/" + "E" + kundennummer + ".zip").getBytes()));
DataPart ist eine innere Klasse, die vor allem von der äußeren Klasse verwendet wird. Man kann da überlegen, dass man das generischer macht und dann DataPart tatsächlich public macht, aber da würde ich dann auch eher anders vorgehen.

Du kannst die Klasse aus dem Post 1:1 nutzen. Überschreib nur die Methode:
Java:
    /**
     * Custom method handle data payload.
     *
     * @return Map data part label with data byte
     * @throws AuthFailureError
     */
    q
    }
wie meinst du das mit dem überschreiben? wenn ich deinen code nehme wird es wieder rot, wenn ich das public wegmache:

Und da musst Du dann natürlich die DataPart Instanzen korrekt bauen mit dem Dateinamen und dem Content.
Ich wollte mich an die Anleitung halten...

Screenshot (273).png
 

KonradN

Super-Moderator
Mitarbeiter
Sorry, wo in dem Link hast Du denn etwas davon gelesen, dass Du den DataPart als Param mitsenden könntest?

Und in deinem Code ist der Code auch nicht in der Klasse VolleyMultipartRequest. Du hast doch den Code der Klasse VolleyMultipartRequest aus dem Post kopiert, oder?

Dann geh in diese Klasse und in dieser Klasse ersetzt Du den Code der Methode durch das, was Du haben willst.
 

wer112

Top Contributor
Java:
protected Map<String, VolleyMultipartRequest.[B]DataPart[/B]> getByteData() throws AuthFailureError {
// ohne VolleyMultipartRequest und ohne dem [B]
So wie im dem Beispiel auch.
geht ja nicht, wie im bp von dir:
Screenshot (274).png
das einzigste was dann geht wäre das ich es auf protected stelle
 

wer112

Top Contributor
Sorry, wo in dem Link hast Du denn etwas davon gelesen, dass Du den DataPart als Param mitsenden könntest?
das steht dort im code:
Java:
            @Override
            protected Map<String, DataPart> getByteData() {
                Map<String, DataPart> params = new HashMap<>();
                long imagename = System.currentTimeMillis();
                params.put("image", new DataPart(imagename + ".png", getFileDataFromDrawable(bitmap)));
                return params;
            }
        };

        //adding the request to volley
        Volley.newRequestQueue(this).add(volleyMultipartRequest);
    }
Und in deinem Code ist der Code auch nicht in der Klasse VolleyMultipartRequest. Du hast doch den Code der Klasse VolleyMultipartRequest aus dem Post kopiert, oder?

Dann geh in diese Klasse und in dieser Klasse ersetzt Du den Code der Methode durch das, was Du haben willst.
weiß nicht, was ich ersetzten will/geht, da ich ja ein zip hochladen möchte und das ist dafür da:
 

Jw456

Top Contributor
Zeige die komplette Klasse VolleyMultipartRequest

Was ich dir gegeben habe ist i der Activity / Fragment.
Bitte bringe das hier nicht durcheinander.

Ich hoffe du weißt und verstehst was eine innere Klasse ist.
 

Jw456

Top Contributor
geht ja nicht, wie im bp von dir:
Screenshot (274).png

das einzigste was dann geht wäre das ich es auf protected stelle
Ist ja auch richtig protected du willst ja overriden. Überschreiben.

Sorry leider immer noch dein altes Problem Kenntnis, Verständnis über OOP.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, da habe ich dann nicht gut genug geschaut und habe mich von dem "params" etwas in die Irre führen lassen. Params wird ja leider auch für die Parameter verwendet aber dort ist es ja eine ganz klare lokale Variable eben für die Map. Und das Überschreiben ist an der Stelle tatsächlich genau so richtig.

Und die angemeckerte Zeile ist dann natürlich in dem Kontext auch verständlich - um die Stelle ging es Dir ja! Du brauchst da das byte Array mit den Daten der erstellten ZIP Datei.

Auch Deine Anpassungen an der DataPart Inneren Klasse sind korrekt. Da es eine reine Datenklasse ist, würde ich die sogar nicht nur public machen sondern sogar public static class nutzen, denn diese Klasse braucht eben nicht die Verbindung zu der umschließenden Instanz. Das ist eine Anpassung, die aber vermutlich nicht dein Problem löst, denn Du warst ja im Methoden-Rumpf einer Instanzmethode der Klasse und daher müsste es prinzipiell auch so funktioniert haben.

Daher also erst einmal eine große Entschuldigung von mir! Ich habe hier viel zu oberflächig gelesen und zu vorschnell geantwortet!

Nun aber zu dem Kernproblem: Du müsstest die Daten der ZIP Datei, dessen URI Du ja hast, so lesen können:
Java:
    public static byte[] uriToByteArray(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        // Puffer für den Lesevorgang
        byte[] buffer = new byte[1024];
        int len;
        
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }
        
        return byteBuffer.toByteArray();
    }

Sprich: Du liest alles und schreibst es in ein ByteArrayOutputStream. Von dem kannst Du Dir dann das byte Array geben lassen.

Es wird ein Context gebraucht, also z.B. Deine Activity. Aber das wirst Du vermutlich alles schon kennen.

Nun vorsichtshalber noch einmal Deine Punkte aus dem ersten Post, damit ich Dir auch wirklich antworte:
Ich kann DataPart in der getByteData Methode nicht importieren, obwohl es anzeigt.
Die Klasse und auch die Methoden hast du public gemacht. Das ist ein wichtiger Schritt. Damit Du die Klasse auch außerhalb der Parent Klasse nutzen kannst (die brauchst Du ja in der Klasse nicht), sollte es eine public static class sein.
Das Referenzieren über ParentClass.ChildClass, wie Du es im Code gezeigt hast, sollte so aber eigentlich gehen (es sei denn ich übersehe gerade etwas).

Wie kann ich da meine Zip ranhängen? Brauche ich da sonst noch was(Pfad,..?)
Du hast nach der Erstellung der ZIP Datei - so ich mich recht erinnere - die URI. Daher der Code oben. Dabei evtl. aufpassen: Das braucht evtl. viel Speicher. Die Datei wird halt komplett in den Speicher geladen. Aber die Bilder werden hoffentlich nicht zu groß sein...

Und zu der Zeile:
params.put("application/zip", new DataPart("E"+ kundennummer +".zip", ))

Das erste ist nicht der ContentType sondern ein Name, der diesen Part beschreibt. Daher sollte es sowas sein wie "Ausweis" oder so. Denn das packst Du da ja rein.
Beim Konstruktor von DataPart kommt erst der Dateiname und dann nach dem "," kann dann der Aufruf der gezeigten Methode kommen.

params.put("Ausweis", new DataPart("E"+ kundennummer +".zip", uriToByteArray(zipUri))
mit zipUri einer Variablen mit der Uri von dem ZIP File, das Du erstellt hast.
 

KonradN

Super-Moderator
Mitarbeiter
Ich weiß nicht ob ich das so machen muss, schließlich hat ja der Entwickler nicht ohne Grund es NICHT public gemacht.
Ja, das ist der Punkt, der mich etwas irritiert. An der Klasse scheint ja auch noch mehr zu fehlen. So wird der content type ja nicht gesetzt. Daher wäre die innere Klasse in meinen Augen eher etwas wie:
Java:
    public static class DataPart {
        private String fileName;
        private byte[] content;
        private String type;

        public DataPart(String fileName, String type, byte[] content) {
            this.fileName = fileName;
            this.type = type;
            this.content = content;
        }

        public String getFileName() {
            return fileName;
        }

        public byte[] getContent() {
            return content;
        }

        public String getType() {
            return type;
        }

    }

Deine Anpassungen waren schon gute, richtig Schritte. Aber diese innere Klasse war wenig durchdacht. Die Frage, die ich mir jetzt stelle, ist aber: Ist der Rest ebenso wenig durchdacht? Nicht, dass Du noch mehr Probleme haben wirst, weil da noch mehr Probleme in dem Code sind. Ich selbst habe keine Android Umgebung um damit jetzt selbst zu testen.

Wenn es funktioniert, dann brauchst Du aber noch den Server Part um den Request auszuwerten. Evtl. ist es einfacher, wenn Du hier das Byte Array einfach Base64 codiert sendest. Dann ist es ein einzelner, langer String und den kannst Du in einem Request wie gewohnt mitsenden. Sprich: So, wie Du auch Formulardaten überträgst. Wichtig dabei: Es muss im Body sein und nicht in der URL, da es sonst zu lang sein dürfte....

Mit der Methode uriToByteArray bekommst du das byte Array und das kannst du dann z.B. per
String base64Encoded = Base64.getEncoder().encodeToString(byteArray);
zu einem base64 codierten String machen.

Auf PHP Seite kannst Du per base64_decode die Daten bekommen und die könntest Du dann z.B. mit file_put_contents schreiben.

Das nur als kleine Idee, um das Problem mehr auf die Dinge zurück zu führen, die Du bereits auf Client und Server Seite hast. Das könnte es einfacher machen für Dich.
 

KonradN

Super-Moderator
Mitarbeiter
Es ist egal, ob es dann auf php Seite genutzt wird. Der Code in sich ist unvollständig. Das macht den Code dann wenig vertrauenswürdig in meinen Augen. Daher auch die alternative Möglichkeit, die ich genannt habe.
 

wer112

Top Contributor
Das erste ist nicht der ContentType sondern ein Name, der diesen Part beschreibt. Daher sollte es sowas sein wie "Ausweis" oder so. Denn das packst Du da ja rein.
Beim Konstruktor von DataPart kommt erst der Dateiname und dann nach dem "," kann dann der Aufruf der gezeigten Methode kommen.

params.put("Ausweis", new DataPart("E"+ kundennummer +".zip", uriToByteArray(zipUri))
mit zipUri einer Variablen mit der Uri von dem ZIP File, das Du erstellt hast.
Habe das nun :
Java:
Environment.getExternalStorageDirectory() + "/Download/" + "E" + kundennummer + ".zip"
in ein String gepackt und habe das reingeladen und AS Wollte es parsen:
Java:
params.put("Personaldata", new DataPart("E"+ kundennummer +".zip", uriToByteArray(getActivity(), Uri.parse(zipUri))));
Hofentlich iast das so richtig.


Ich kann das nicht Überprüfen, ob es funktioniert, da ich mit Dateien in PHP nict auskenne.

Hae vom VollyMultiRequest die PHP Seite genommen: https://www.maxester.com/blog/2020/...load-image-to-server-using-volley-in-android/

Und umgebaut, leider kommt nixs in dem Pfand an:

PHP:
<?php
session_start();

include_once("includes/utf-8.php");
require "connections/db.php";

$array = array();

$angemeldet = trim($_SESSION['angemeldet']);
$kundennummer = trim($_SESSION['kn']);

if(empty($angemeldet) or empty($kundennummer)){
    
    

    echo "Session fehler";


}else{
    
    
 

    if($angemeldet == 1){

        $dir = $_SERVER['DOCUMENT_ROOT']."/doc/entdata";
        
        if(empty($_FILES["Personaldata"])){
            
            echo "Datei ist leer";

        }else{

            if(move_uploaded_file($_FILES['Personaldata']["E" . $kundennummer . ".zip"][$dir])){
                
                $arr = array(

                    'status'=>1,

                    'message'=>"File Uploaded",

                    'file_name'=>$file_name

                    );

            }else{

                $arr = array(

                    'status'=>0,

                    'error'=>"Something Went Wrong Please Retry",

                    'file_name'=>$file_name

                    );
            }
        }

        print_r($arr);

    }

}

?>

Ob der Pfad simmt kann ich nicht sagen, evtl. müste ich die ganze adresse angeben...

Wie kann ich sehen, ob der Code von dir funktioniert?
 

Jw456

Top Contributor
if(move_uploaded_file($_FILES['Personaldata']["E" . $kundennummer . ".zip"][$dir])){
Diese Zeile solltest du noch mal überdenken.

Schaue und verstehe auch den PHP Code von dem Tutoriell was du dir ausgesucht hast.
Da hast du wieder einige weggelassen, weil du es nur einfach Kopierst ohne es verstanden zu haben.
Was da Passiert.



Und auch so etwas kann man mit Postman Testen da brauchst du erst mal keine APP.




Tipp baue PHP vom Tutoriell nach und teste es mit Postman. Ohne App
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Wenn ich mich mal kurz einhaken dürfte. Hintergrund des Vorschlags bzgl. Mutlipart-Requests war, dass Dir der Speicher ausgegangen war. Damit musst Du rechnen, wenn Du zig MB in den Speicher lädst und dann auch noch zu Base64 kodierst.

Ich habe die Klasse VolleyMultipartRequest mal kurz überflogen und verstehe gerade nicht, was die in dieser Form großartig bringen soll:
  1. Die Daten werden nicht mehr Base64-kodeirt gesendet. Spart Datenmenge -> okay.
  2. Die Daten müssen nach wie vor vollständig im Speicher gehalten werden -> das ist aber doch genau das Kernproblem.
Um 2. zu lösen, müsste der content in DataPart ein InputStream und kein byte-Array sein - und natürlich der Code in VolleyMultipartRequest entsprechend angepasst werden.
 

Jw456

Top Contributor
1. Der TE wollte vom Anfang an ohne Base64 arbeiten.
Er hatte es aber nicht in hin bekommen.
In einem vorherigen Thread hatte einer etwas von Base64 gesagt. Da er es mit einem normalen Multipart nicht geschafft hatte, hatte er es mit Base64 versucht.
Und auch hier ist er gescheitert.
 

Jw456

Top Contributor
2. Setzt aber auch voraus das da sein Server und PHP für dem Empfang von großen Daten konfiguriert ist.

Der TE scheint sich aber nicht sonderlich mit PHP auszukennen.
 

wer112

Top Contributor
Diese Zeile solltest du noch mal überdenken.

Schaue und verstehe auch den PHP Code von dem Tutoriell was du dir ausgesucht hast.
Da hast du wieder einige weggelassen, weil du es nur einfach Kopierst ohne es verstanden zu haben.
Was da Passiert.



Und auch so etwas kann man mit Postman Testen da brauchst du erst mal keine APP.
Meinst du die Software Postmann?
Tipp baue PHP vom Tutoriell nach und teste es mit Postman. Ohne App
das Gundgerüst muss sein, und ich sende keine bilder sondern zips
 

wer112

Top Contributor
Eine sec Google Suche.
Hat nicht weitergebracht, habe es selber rausgefunden.
Kommt nicht hochgeladen raus:

PHP:
<?php
session_start();

include_once("includes/utf-8.php");
require "connections/db.php";

$array = array();

$angemeldet = 1;//trim($_SESSION['angemeldet']);
$kundennummer = "855";//trim($_SESSION['kn']);

if(empty($angemeldet) or empty($kundennummer)){
    
    
    $array['response'] = "Session fehler";
    echo json_encode($array);


}else{
    
    
 

    if($angemeldet == 1){

        
        $zip = $_FILES['zip'];

        $dir = $_SERVER['DOCUMENT_ROOT'] . "/projekte/klugstore/doc/entdata";

        

        if(empty($zip)){

            $array['response'] = "Datei ist leer.";
            echo json_encode($array);

        }else{


           if(move_uploaded_file("E" . $kundennummer . ".zip", $dir)){
            
            $array['response'] = "hochgeladen";
            echo json_encode($array);

           }else{

            $array['response'] = "nicht hochgeladen";
            echo json_encode($array);
           }


        }

      

    }else{
        $array['response'] = "nicht angemeldet.";
        echo json_encode($array);
    }

}

?>
 

Jw456

Top Contributor
Java:
if(move_uploaded_file("E" . $kundennummer . ".zip", $dir)){
Dann Schaue doch mal in die Doku was „move_uploaded_file“ macht und wo PHP die gesendeten Daten zwischen speichert. Du meist also das du einfach mit dem Namen der gesendeten Datei was abspeichern kannst. Ich habe dir eine Doku zu PHP und zu der globalen Variablen $_FILES gegen in Post #17. Ich Hätte erwartet das du das auch liest.
 

wer112

Top Contributor
Java:
if(move_uploaded_file("E" . $kundennummer . ".zip", $dir)){
Dann Schaue doch mal in die Doku was „move_uploaded_file“ macht und wo PHP die gesendeten Daten zwischen speichert. Du meist also das du einfach mit dem Namen der gesendeten Datei was abspeichern kannst. Ich habe dir eine Doku zu PHP und zu der globalen Variablen $_FILES gegen in Post #17. Ich Hätte erwartet das du das auch liest.
move_uploaded hat zwei Parameter: 1: Name und 2. Der Pfad zum Speichern, sowiet habe ich es vermutlich verstanden. Habe es auch probiert mit temp_name gemacht.
https://www.php.net/manual/en/function.move-uploaded-file.php -> move_uploaded_file($tmp_name, "$uploads_dir/$name");

Also erst der Temp Name und dann den Link.

Bei $_FILES können weitere Informationen raus hohlen in dem man ein zweites[] macht. denke ich mal. der 1. Parameter ist der Key und der zweite, was man haben will.

Irgendwie klappt das bei mir nie.

https://www.php.net/manual/en/function.move-uploaded-file.php -> move_uploaded_file(string $from, string $to): bool = 2 Agummente...
 

Jw456

Top Contributor
Baue erstmal ein PHP ohne e den session und angemeldet… kram.
Nur ein PHP zum üben , Übertragen und Speichen von Daten.
Fange keiner an.


Etwas mehr eigen Initiative sollte man schon erwarten können.

.
 

wer112

Top Contributor
Baue erstmal ein PHP ohne e den session und angemeldet… kram.
Nur ein PHP zum üben , Übertragen und Speichen von Daten.
Fange keiner an.


Etwas mehr eigen Initiative sollte man schon erwarten können.

.
Ich habe es nun mit Postman geschafft, was hochzuladen und mit deinem Tutoriel mit der Boolen:

Aktueler Code:
PHP:
<?php
session_start();

include_once("includes/utf-8.php");
require "connections/db.php";

$array = array();

$angemeldet = trim($_SESSION['angemeldet']);
$kundennummer = trim($_SESSION['kn']);

if(empty($angemeldet) or empty($kundennummer)){
    
    
    $array['response'] = "Session fehler";
    echo json_encode($array);


}else{
    
    
 

    if($angemeldet == 1){

        
        $zip = $_FILES['zip']['tmp_name'];

        $dir = $_SERVER['DOCUMENT_ROOT'] . "/projekte/klugstore/doc/entdata/";

        

        if(empty($zip)){

            $array['response'] = "Datei ist leer.";
            echo json_encode($array);

        }else{

            if($_FILES['zip']['type'] == "application/zip"){
                $check = move_uploaded_file($zip,$dir.$_FILES["zip"]["name"]);
                
                if($check){
              
                $array['response'] = "erfolgreich hochgeladen";
                echo json_encode($array);

                }else{

                    $array['response'] = "nicht erfolgreich hochladen";
                    echo json_encode($array);
                }

            }else{
                $array['response'] = "falsches Format";
                echo json_encode($array);
            }

            
            


        }

      

    }else{
        $array['response'] = "nicht angemeldet.";
        echo json_encode($array);
    }

}

?>

Jetzt müssen wir zum Java Teil gehen.....
 

wer112

Top Contributor
Da der PHP Teil funktioniert jetzt, müssen wir über das Java TEil reden. Er Sendet die Datei defekt und leer an den Server.

Der Code:
Java:
VolleyMultipartRequest volleyMultipartRequest = new VolleyMultipartRequest(Request.Method.POST,upload_url,
                new Response.Listener<NetworkResponse>() {
                    @Override
                    public void onResponse(NetworkResponse response) {
                        try {
                            JSONObject obj = new JSONObject(new String(response.data));
                            Log.e("Free Entwickler", "Response Upload: " + obj);
                            Toast.makeText(getActivity(), obj.getString("message"), Toast.LENGTH_SHORT).show();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_LONG).show();
                        Log.e("Free Entwickler","Vollx Error: " +error.getMessage());
                    }
                }) {


            @Override
            protected Map<String, DataPart> getByteData() {
                Map<String, DataPart> params = new HashMap<>();

                params.put("zip", new DataPart("E" + kundennummer + ".zip", zipUri.getBytes()));
                return params;
            }
        };

        queue.add(volleyMultipartRequest);

Der 1. Parameter vom new DataPart erstellt die Datei damit, aber er sendet die Datei nicht, er erstellt in PHP nur die Datei, aber überträg diese nicht.
 

Marinek

Bekanntes Mitglied
Also du musst den gleichen Request in Java machen, wie in Postman...

Für dich ist das alles zusammenhangslos. Daher müssen wir dir die Enden verknüpfen.

Wie sieht dein Request aus, in Postman, den du erstellt hast.

Konzentriere dich auf die Frage und versuche diese zu beantworten. Was da passiert und nicht wissen wir ja, das muss man nicht in jedem Posting wiederholen.

Das mit der Session, funktioniert doch garantiert auch nicht. Du musst ja diese Information auch mitsenden. Das sehe ich bei dir nirgens. Kann auch Volley implizit machen, keine Ahnung. Den Hinweis das so EZ wie möglich zu machen, hast du auch ignoriert.
 

wer112

Top Contributor
was steht in zipURI ? zeige wie du das Byte array bildest.
Garnicht, habe es aber dann mit den zwei Methoden die KonradN und so gegeben haben. 1 einziges mal kam was an auch mit einem Inhalt, war aber defekt, aber kein 2. mal. lso zufällig. war kaputt.

Diese 2 Methoden habe ich probiert:

Java:
 public static byte[] uriToByteArray(Context context, Uri uri) throws IOException {
        InputStream inputStream = context.getContentResolver().openInputStream(uri);
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        // Puffer für den Lesevorgang
        byte[] buffer = new byte[1024];
        int len;

        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }



        return byteBuffer.toByteArray();


    }
Java:
 private byte[] getFileDataFromPath(File file) {
        byte[] fileData = null;
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            fileData = new byte[(int) file.length()];
            fileInputStream.read(fileData);
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileData;
    }

Entweder dauert das mit 8MB zu lange oder es geht nicht. Bekomme kein Response dann..
 

Jw456

Top Contributor
überlege was zipUri.getBytes() macht und was du willst . Du willst nicht den Inhalt des Strings ( also deinen Deitanamen) in Byts haben sondern die Datei in ein ByteArray.

Das mit den Session, kann ich meinen Vorredner nur beipflichten.
 

wer112

Top Contributor
Also du musst den gleichen Request in Java machen, wie in Postman...

Für dich ist das alles zusammenhangslos. Daher müssen wir dir die Enden verknüpfen.

Wie sieht dein Request aus, in Postman, den du erstellt hast.

Konzentriere dich auf die Frage und versuche diese zu beantworten. Was da passiert und nicht wissen wir ja, das muss man nicht in jedem Posting wiederholen.
In Postmann habe ich eine zip Datei angehangen habe den Key auf zip geschrieben und ich erhalte dann die richtige Response und es erscheint auch die Datei im Ordner und diese funktioniert auch einwandfrei. Bei Änderung des Key, bekomme ich keine Information.

In Java habe ich genau diesen Key verwendet, damit dieser übereinstimmt. Habe einen Namen gewählt, leider wird mit diesem Namen eine Datei erstellt und deswegen steht im Namen .zip damit eine Zip erstellt wird. Die Zip ist leer und beschädigt. Habe es mit 2 anderen Methoden Probiert, ein einziges Mal kam was größeres an, aber dann niewieder.

Ich muss den Inhalt und deie Ganze Zip mitgeben und nicht nur den Namen plus Endung.
 

wer112

Top Contributor

Jw456

Top Contributor
Lasse das doch mal mit den Session . Mache ein einfaches PHP und eine einfache APP die nur den Request schickt und Teste es aus bis du es verstanden hast . So wird das nichts werden.
 

Neue Themen


Oben