2016-12-15 7 views
0

Ich versuche eine Volley-PUT-Anfrage zu machen, um ein Bild hochzuladen. Da httpEntity jetzt veraltet ist, musste ich andere Nachforschungen anstellen, stieß auf diese Lösungen und versuchte sie in meinen Code zu implementieren: 1. https://gist.github.com/anggadarkprince/a7c536da091f4b26bb4abf2f92926594 2. How to send multipart request using Volley without HttpEntity? 3. Working POST Multipart Request with Volley and without HttpEntity aber immer noch kann ich mein Bild nicht hochladen. Das Bild, das ich hochladen möchte, wird entweder von der Kamera aufgenommen oder in der Galerie ausgewählt und auf onClick ausgeführt.Volley PUT Bild Anfrage

ProfileSetting.java

public class ProfileSetting extends AppCompatActivity implements AdapterView.OnItemSelectedListener { 

private ImageView CustomerIcon; 
private Button confirm_button; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_profile_setting); 
    CustomerIcon = (ImageView) findViewById(R.id.CustomerIcon); 
    confirm_button = (Button) findViewById(R.id.confirm_button); 
    CustomerIcon.setOnClickListener(new ImageView.OnClickListener(){ 
     public void onClick(View v){ 

      showPickImageDialog(); 

     } 


    }); 

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

      //PUT VOLLEY 
      saveProfileAccount(); 

     } 
    }); 
} 
private void showPickImageDialog() { 
    AlertDialog.Builder builderSingle = new AlertDialog.Builder(ProfileSetting.this); 
    builderSingle.setTitle("Choose Profile Icon"); 

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
      ProfileSetting.this, 
      android.R.layout.select_dialog_singlechoice); 
    arrayAdapter.add("Gallery"); 
    arrayAdapter.add("Camera"); 

    builderSingle.setNegativeButton(
      "cancel", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 

    builderSingle.setAdapter(
      arrayAdapter, 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        switch (which) { 
         case 0: 
          Intent pickPhoto = new Intent(Intent.ACTION_PICK, 
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
          startActivityForResult(pickPhoto, 1); 
          break; 

         case 1: 
          Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
          startActivityForResult(takePicture, 0); 
          break; 
        } 

       } 
      }); 
    builderSingle.show(); 
} 
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) { 
     case 0: 
      if(resultCode == RESULT_OK){ 


       Uri selectedImage = imageReturnedIntent.getData(); 
       CustomerIcon.setImageURI(selectedImage); 

      } 

      break; 
     case 1: 
      if(resultCode == RESULT_OK){ 

       Uri selectedImage = imageReturnedIntent.getData(); 
       CustomerIcon.setImageURI(selectedImage); 

      } 
      break; 
    } 
} 
private void saveProfileAccount() { 
    // loading or check internet connection or something... 
    // ... then 


    String url = "https://url to put image to"; 
    SharedPreferences sp1=this.getSharedPreferences("FINALTOKEN", Context.MODE_PRIVATE); 
    final String finalToken = sp1.getString("FINALTOKEN",""); 


    VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.PUT, url, new Response.Listener<NetworkResponse>() { 
     @Override 
     public void onResponse(NetworkResponse response) { 
      String resultResponse = new String(response.data); 
      try { 
       JSONObject result = new JSONObject(resultResponse); 
       String status = result.getString("status"); 
       String message = result.getString("message"); 

       if (status.equals(Constant.REQUEST_SUCCESS)) { 
        // tell everybody you have succeed upload image and post strings 
        Log.i("Messsage", message); 
       } else { 
        Log.i("Unexpected", message); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      NetworkResponse networkResponse = error.networkResponse; 
      String errorMessage = "Unknown error"; 
      if (networkResponse == null) { 
       if (error.getClass().equals(TimeoutError.class)) { 
        errorMessage = "Request timeout"; 
       } else if (error.getClass().equals(NoConnectionError.class)) { 
        errorMessage = "Failed to connect server"; 
       } 
      } else { 
       String result = new String(networkResponse.data); 
       try { 
        JSONObject response = new JSONObject(result); 
        String status = response.getString("status"); 
        String message = response.getString("message"); 

        Log.e("Error Status", status); 
        Log.e("Error Message", message); 

        if (networkResponse.statusCode == 404) { 
         errorMessage = "Resource not found"; 
        } else if (networkResponse.statusCode == 401) { 
         errorMessage = message+" Please login again"; 
        } else if (networkResponse.statusCode == 400) { 
         errorMessage = message+ " Check your inputs"; 
        } else if (networkResponse.statusCode == 500) { 
         errorMessage = message+" Something is getting wrong"; 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
      Log.i("Error", errorMessage); 
      error.printStackTrace(); 
     } 
    }) { 
     @Override 
     public Map<String,String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers= new HashMap<>(); 
      headers.put("Authorization",finalToken); 
      return headers; 
     } 

     @Override 
     protected Map<String, DataPart> getByteData() { 
      Map<String, DataPart> params = new HashMap<>(); 
      // file name could found file base or direct access from real path 
      // for now just get bitmap data from ImageView 
      params.put("avatar", new DataPart("file_avatar.jpg", ImageConverter.getFileDataFromDrawable(getBaseContext(), CustomerIcon.getDrawable()), "image/jpeg")); 

      return params; 
     } 
    }; 

    VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest); 
} 
} 

VolleyMultipartRequest.java und VolleySingleton.java ich die gleiche Klasse bin mit wie das, was meine erste Verbindung hat.

Mein Fehler vor allem sind ich nicht Symbol ‚Constant‘ in der if-Anweisung nicht auflösen kann:

if (status.equals(Constant.REQUEST_SUCCESS)) 

so habe ich versucht, die Aussage zu kommentieren, nachdem der Code ausgeführt bekam ich folgende Fehlermeldung:

BasicNetwork.performRequest: Unexpected response code 500 for https://my url 

W/System.err: org.json.JSONException: No value for status 

Ich bin mir nicht sicher, was mein Problem verursacht, bitte helfen, danke!

+0

Konvertieren Sie Ihr Bild in Base64-Zeichenfolge und verwenden Sie die POST-Methode. Es ist sehr leicht. Überprüfen Sie das Tutorial @ [Android Volley Image Upload] (https://www.simplifiedcoding.net/android-volley-tutorial-to-upload-image-to-server/) –

+0

Hallo @RahulSharma, ist es möglich mit einer PUT-Methode ? Da mein Backend eine PUT-Methode benötigt. – JerryKo

Antwort

0

ist hier einfache Lösung und vollständige Beispiel für das Hochladen von Datei mit Volley Android

1) Gradle Import

compile 'dev.dworks.libs:volleyplus:+' 

2) Jetzt erstellen Klasse RequestManager

public class RequestManager { 
    private static RequestManager mRequestManager; 
    /** 
    * Queue which Manages the Network Requests :-) 
    */ 
    private static RequestQueue mRequestQueue; 
    // ImageLoader Instance 

    private RequestManager() { 

    } 

    public static RequestManager get(Context context) { 

     if (mRequestManager == null) 
      mRequestManager = new RequestManager(); 

     return mRequestManager; 
    } 

    /** 
    * @param context application context 
    */ 
    public static RequestQueue getnstance(Context context) { 

     if (mRequestQueue == null) { 
      mRequestQueue = Volley.newRequestQueue(context); 
     } 

     return mRequestQueue; 

    } 


} 

3) Jetzt erstellen Eine zu bearbeitende Klasse Anforderung zum Hochladen der Datei WebService

public class WebService { 
    private RequestQueue mRequestQueue; 
    private static WebService apiRequests = null; 

    public static WebService getInstance() { 
     if (apiRequests == null) { 
      apiRequests = new WebService(); 
      return apiRequests; 
     } 
     return apiRequests; 
    } 
    public void updateProfile(Context context, String doc_name, String doc_type, String appliance_id, File file, Response.Listener<String> listener, Response.ErrorListener errorListener) { 
     SimpleMultiPartRequest request = new SimpleMultiPartRequest(Request.Method.POST, "YOUR URL HERE", listener, errorListener); 
//  request.setParams(data); 
     mRequestQueue = RequestManager.getnstance(context); 
     request.addMultipartParam("token", "text", "tdfysghfhsdfh"); 
     request.addMultipartParam("parameter_1", "text", doc_name); 
     request.addMultipartParam("dparameter_2", "text", doc_type); 
     request.addMultipartParam("parameter_3", "text", appliance_id); 
      request.addFile("document_file", file.getPath()); 

     request.setFixedStreamingMode(true); 
     mRequestQueue.add(request); 
    } 
} 

4) Und nun wie folgt der Aufruf der Methode, den Dienst Hit

public class Main2Activity extends AppCompatActivity implements Response.ErrorListener, Response.Listener<String>{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 
     Button button=(Button)findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       uploadData(); 
      } 
     }); 
    } 

    private void uploadData() { 
     WebService.getInstance().updateProfile(getActivity(), "appl_doc", "appliance", "1", mChoosenFile, this, this); 
    } 

    @Override 
    public void onErrorResponse(VolleyError error) { 

    } 

    @Override 
    public void onResponse(String response) { 
    //Your response here 
    } 
} 

mChoosenFile ist Ihre Bilddatei

0

Zunächst einmal konvertieren Sie Ihre Bild-Bitmap den folgenden Code Base64 Zeichenfolge mit:

public String getStringImage(Bitmap bmp){ 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
     byte[] imageBytes = baos.toByteArray(); 
     String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
     return encodedImage; 
    } 

Dann eine PUT-Anforderung wie die folgende machen und die base64-String als Parameter der Anforderung übergeben

Verweisen Sie auf Android Volley Tutorial, wenn Sie Schwierigkeiten bei der Implementierung der Volleyanforderung haben.

+0

Vielen Dank für Ihre Antwort, aber ist es möglich, eine mehrteilige Anfrage zu machen? – JerryKo