2016-02-17 181 views
0

我想将用户采用的图像上传到使用Android Volley的服务器。我已经阅读了这些问题的其他答案,但他们建议使用多部分请求,但我想使用Volley。无法使用Android Volley将图像上传到服务器

我正在尝试上传用户为配置文件图片选择的图像。我提供用户ID来识别用户和形象的字符串形式,图像将被存储在特定的目录取决于用户ID。如果操作成功,服务器将为true,否则为false。

这里是功能上传图像

private void uploadImage() { 
     //Showing the progress dialog 
     final ProgressDialog loading = ProgressDialog.show(this, "Uploading...", "Please wait...", false, false); 
     String UPLOAD_URL = "http://parque.890m.com/upload-user-img.php"; 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String s) { 
         //Dismissing the progress dialog 
         Log.d("response", s); 
         loading.dismiss(); 

         //Showing toast message of the response 
         if (s.equals("true")) { 
          Log.d("upload_success", "successful upload : " + s); 
         } else if (s.equals("false")) { 
          Log.d("upload_failure", "successful upload : " + s); 
         } else { 
          Log.d("connection_failure", "connection failed"); 
         } 
         Toast.makeText(UserProfile.this, s, Toast.LENGTH_LONG).show(); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError volleyError) { 
         //Dismissing the progress dialog 
         loading.dismiss(); 

         //Showing toast 
         Log.d("upload_error", "" + volleyError.getMessage()); 
         Toast.makeText(UserProfile.this, volleyError.getMessage(), Toast.LENGTH_LONG).show(); 
        } 
       }) { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       //Converting Bitmap to String 
       String image = getStringImage(bitmap); 
       Log.d("image_string", "" + image); 

       //Getting Image Name 
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(UserProfile.this); 
       String name = preferences.getString("id", null); 

       //Creating parameters 
       Map<String, String> params = new Hashtable<String, String>(); 

       //Adding parameters 
       params.put(KEY_IMAGE, image); 
       params.put(KEY_NAME, name); 

       //returning parameters 
       Log.d("params : ", "" + params.toString()); 
       return params; 
      } 
     }; 

     //Creating a Request Queue 
     RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext()); 

     //Adding request to the queue 
     stringRequest.setRetryPolicy(new DefaultRetryPolicy(DefaultRetryPolicy.DEFAULT_TIMEOUT_MS * 2, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
     requestQueue.add(stringRequest); 
    }*/ 

我写了一个函数图像转换为字符串

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

和服务器端代码

<?php 

    require_once 'inc/connection.inc.php'; 

    if(isset($_POST['user'])){ 
     $success = false; 
     $image = $_POST['image']; 
     $name = $_POST['user']; 

     $path = "uploads/$name"; 

     $actualpath = "http://parque.890m.com/$path"; 

     $query = "UPDATE `users` SET `photo_url` = $actualpath WHERE `user_id`= $name"; 

     if(mysqli_query($connection,$query)){ 
     file_put_contents($path,base64_decode($image)); 
     $success = true; 
      } 

     echo json_encode($success); 
     mysqli_close($connection); 
    } 

服务器在上传图像时返回false,并且图像未上传。

首先创建一个文件名为:MultipartRequest如下:

public class MultipartRequest extends Request<String> { 
private MultipartEntityBuilder entity = MultipartEntityBuilder.create(); 
private final Response.Listener<String> mListener; 
private final File file; 
private final HashMap<String, String> params; 

public MultipartRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, File file, HashMap<String, String> params) 
{ 
    super(Method.POST, url, errorListener); 

    mListener = listener; 
    this.file = file; 
    this.params = params; 
    buildMultipartEntity(); 
    buildMultipartEntity2(); 

} 



private void buildMultipartEntity() 
{ 
    entity.addBinaryBody(KEY_IMAGE, file, ContentType.create("image/jpeg"), file.getName()); 
    entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
    entity.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8")); 

    try 
    { 
     for (String key : params.keySet()) { 
      entity.addPart(key, new StringBody(params.get(key))); 
     } 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     VolleyLog.e("UnsupportedEncodingException"); 
    } 
} 

@Override 
public String getBodyContentType() 
{ 
    return entity.build().getContentType().getValue(); 
} 
@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = super.getHeaders(); 

    if (headers == null 
      || headers.equals(Collections.emptyMap())) { 
     headers = new HashMap<String, String>(); 
    } 

    headers.put("Accept", "application/json"); 

    return headers; 
} 

@Override 
public byte[] getBody() throws AuthFailureError 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try 
    { 
     entity.build().writeTo(bos); 
    } 
    catch (IOException e) 
    { 
     VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
    } 
    return bos.toByteArray(); 
} 
/** 
* copied from Android StringRequest class 
*/ 
@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 
    String parsed; 
    try { 
     parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
    } catch (UnsupportedEncodingException e) { 
     parsed = new String(response.data); 
    } 
    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); 
} 

@Override 
protected void deliverResponse(String response) { 
    mListener.onResponse(response); 
}} 

此外,我们正在使用多要求,我们需要上传

+0

一次尝试我的图书馆https://github.com/amitshekhariitbhu/Fast-Android-Networking#uploading-a-file-to-server –

回答

0

在使用凌空为此,您可以使用多要求文件(图片)在这里。因此,使用此代码将图像作为文件上传。现在,你在哪里做StringRequest只是做多部分请求如下:

public void uploadImage() 
{ 
    try { 
     pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Loading..."); 
     pDialog.show(); 

      HashMap params = new HashMap<String, String>(); 

      params.put(KEY_NAME, name); 
     MultipartRequest sr = new MultipartRequest(UPLOAD_URL, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       if ((pDialog != null) && pDialog.isShowing()) { 
        pDialog.dismiss(); 
       } 
       Log.d("file", f + ""); 
       Log.d("", ".......response====" + response.toString()); 

       //////// 
       try { 
        JSONObject object = new JSONObject(response); 
        String serverCode = object.getString("code"); 
        if (serverCode.equalsIgnoreCase("0")) { 

        } 
        if (serverCode.equalsIgnoreCase("1")) { 
         try { 

          if ("1".equals(serverCode)) { 
           JSONObject object1 = object.getJSONObject("data"); 

          } 
         } 
         catch (Exception e) { 
          e.printStackTrace(); 
         } 


        } 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       if ((pDialog != null) && pDialog.isShowing()) { 
        pDialog.dismiss(); 
       } 
       ; 
       // VolleyLog.d("", "Error: " + error.getMessage()); 
       if (error instanceof TimeoutError || error instanceof NoConnectionError) { 
        Toast.makeText(getActivity(), "Timeout Error", 
          Toast.LENGTH_LONG).show(); 
       } else if (error instanceof AuthFailureError) { 
        VolleyLog.d("", "" + error.getMessage() + "," + error.toString()); 
       } else if (error instanceof ServerError) { 
        VolleyLog.d("", "" + error.getMessage() + "," + error.toString()); 
       } else if (error instanceof NetworkError) { 
        VolleyLog.d("", "" + error.getMessage() + "," + error.toString()); 
       } else if (error instanceof ParseError) { 
        VolleyLog.d("", "" + error.getMessage() + "," + error.toString()); 

       } 
      } 

     }, f, params); 
     sr.setRetryPolicy(new DefaultRetryPolicy(100000*2,DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

     sr.setShouldCache(true); 
     VolleySingleton.getInstance(getActivity()).addToRequestQueue(sr); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

MultipartEntity在api 23中折旧。我已经在问题中指定了我不想实现Multipart请求。 –

+0

@AbhishekPrakash但它仍然可以与api 23一起使用,你可以试试。如果你只想与凌空合作,那么这是唯一的方法。 –

+0

MultipartEntityBuilder不能在api 23中工作。 –

相关问题