2017-07-22 43 views
-1

我通過將圖像轉換爲字節數組,將圖像上傳到PHP。之後,我只需使用POST方法提交它。從Android上傳圖像到PHP的高效方式

在服務器端,我做了與我在客戶端(Android應用程序)端做的相反的事情。

我想知道是否有其他的好/高效/聰明的方法來做到這一點。

注意:我只需要在客戶端只使用PHP/JS/HTML和Java。

回答

0

其中一個最有效的方法是做什麼用排球,所以一定要確保它包括在你的gradle產出:

compile 'com.android.volley:volley:1.0.0' 

我個人使用,當你包括排球這是自動包含Universal Image Loader。既然你沒有提供任何你試過的代碼,我會給你一些例子。在您嘗試上傳圖片的活動中,創建一個按鈕。點擊該按鈕時添加此代碼:

Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
i.setType("image/*"); 
startActivityForResult(i, Constants.VALUE_BROWSE_IMAGE_REQUEST); 

這將打開手機中的圖庫瀏覽圖像。在您的活動的頂部聲明一個變量:

private Bitmap mBitmap; 

後,你選擇你想從您的畫廊上傳圖片,寫這樣的代碼:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == Constants.VALUE_BROWSE_IMAGE_REQUEST && 
      resultCode == RESULT_OK && 
      data != null) { 

     try { 
      // Get the photo URI data 
      Uri filePath = data.getData(); 

      // Get the Bitmap from Gallery 
      mBitmap = decodeBitmap(filePath, this); 
     } catch (IOException e) { 
      Toast.makeText(this, "Could not open picture.", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

現在,你有選擇的位圖圖像,你需要的是位圖轉換爲base64,字符串,以便可以凌空能夠上傳:

// Before uploading the selected image to the server, we need to convert the Bitmap to String. 
// This method will convert Bitmap to base64 String. 
private String getStringImage(Bitmap bmp) { 
    ByteArrayOutputStream b = new ByteArrayOutputStream(); 

    // This part handles the image compression. Keep the image quality 
    // at 70-90 so you don't cause lag when loading it on android 
    // (0-low quality but fast load, 100-best (original) quality but slow load) 
    bmp.compress(Bitmap.CompressFormat.JPEG, 80, b); 
    byte[] imageBytes = b.toByteArray(); 
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 
    return encodedImage; 
} 

最後,你可以開始上傳圖片:

private void uploadImage() { 
    StringRequest stringRequest = new StringRequest(
      Request.Method.POST, 
      "URL_TO_YOUR_WEB_API", 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(getApplicationContext(), "Failed to upload image.", Toast.LENGTH_SHORT).show(); 
       } 
      }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 

      // Converting Bitmap to String 
      String image = getStringImage(mBitmap); 

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

      // Add parameters 
      params.put("action", "YOUR_BACKEND_KEY1"); 
      params.put("...", image); 

      // Returning parameters 
      return params; 
     } 
    }; 

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

    // Adding request to the queue 
    requestQueue.add(stringRequest); 
} 

請確保將參數字符串替換爲您已在php中創建後端。

實例網址:

http://yoursite.com/api.php?action=uploadimage&imagebase=adwtgiuewohnjsoiu&caption=somecaptiontext 

然後在Android上的參數是:

params.put("action", "uploadimage"); 
params.put("imagebase", image); 
params.put("caption", "somecaptiontext"); 
+0

請接受這個職位的答案,如果它幫助你... – busuu