2017-06-17 68 views
0

我想用此代碼上傳多個圖像,它的工作原理。我遇到的問題是我通過一個地方params.put(KEY_IMAGE, encodedString)。除此之外,我想通過多個鍵傳遞它們,所以在PHP中定位它們會更容易。Android多重圖像凌空傳遞參數

選擇的圖像:

ChooseBn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Intent in = galleryPhoto.openGalleryIntent(); 
     in.setType("image/*"); 
     in.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(in, GALLERY_REQUEST); 
    } 
}); 

的圖片上傳:

final MyCommand myCommand = new MyCommand(getApplicationContext()); 

UploadBn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     for (String imagePath : imageList) { 
      try { 
       Bitmap bitmap = PhotoLoader.init().from(imagePath).requestSize(500, 500).getBitmap(); 
       final String encodedString = ImageBase64.encode(bitmap); 

       String url = "http://192.168.100.3/upload.php"; 
       StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show(); 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(getApplicationContext(), "Error while uploading image", Toast.LENGTH_SHORT).show(); 
        } 
       }) { 

        String name = NAME.getText().toString().trim(); 
        String lat = LAT.getText().toString().trim(); 
        String lng = LNG.getText().toString().trim(); 

        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 

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

         params.put(KEY_IMAGE, encodedString); 
         params.put(KEY_NAME, name); 
         params.put(KEY_LAT, lat); 
         params.put(KEY_LNG, lng); 

         return params; 
        } 
       }; 

       myCommand.add(stringRequest); 

      } catch (FileNotFoundException e) { 
       Toast.makeText(getApplicationContext(), "Error while loading image", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 
}); 
+0

如果您有多個圖像,那麼您應該分別對它們進行編碼。 –

+0

這很明顯,我如何分離每個圖像? imageList是一個ArrayList <>(); – Andri

+0

我看到你有這個清單,那麼究竟有什麼不正確?你的PHP是否接受'KEY_IMAGE'變量的值是否正確? –

回答

0

兩種方法來我的心。

在他們兩人的需要自定義Image類:

public class Image { 
    public String imageString; 
    public String name; 
    public double lat, lng; 
} 

快速的解決方案使用toString()

使用toString(),並把它作爲參數。

因此,而不是在imageList調用個人imagePath API,你會爲請求添加個人Image對象作爲參數如下:

for (String imagePath : imageList) { 
    Image image = new Image(); 
    // Set image's properties here 
    params.add(image.name, image.toString()); 
} 

你要麼解析無論你在Image.toString()寫或更好,但你可以實際上JSON形式返回對象,簡化了重新分析服務器上:

@Override 
public String toString() { 
    Gson gson = new Gson(); 
    return gson.toJson(this); 
} 

更好的解決方案:

更好的解決方案使用JsonArrayRequest使用已建好的Image類和Gson解析將所有的Image對象傳遞到一起。

JSONArray imageArray = null; 
try { 
    imageArray = new JSONArray(gson.toJson(imageList)); // Note that imageList is List<Image> and not List<String> 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

JsonArrayRequest request = new JsonArrayRequest(Request.Method.POST, url, imageArray, new Response.Listener<JSONArray>() { 
    @Override 
    public void onResponse(JSONArray response) { 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
    } 
}); 

注意,在這些解決方案都必須通過解析,您會收到服務器上的JSON獲得圖像的字符串。作爲對此努力的回報,您可以根據您的請求獲得一個很好的結構。

+0

伴侶,對不起,如果愚蠢/冒犯,但我對這兩個建議都不瞭解。我不知道如何實現/嘗試它作爲單獨的參數。 – Andri

+0

簡單地說,將您的圖像和相關屬性作爲JSON字符串發送並將其解析回服務器上。 – BhalchandraSW

+0

你高估了我對這一英里的理解。讓我使它超級簡單,從建議1中獲取代碼。如何以「$ _POST ['image'];」形式訪問PHP中的圖像「 – Andri