2015-05-08 26 views
7

kullanarak base64 kodlu görüntü sunucuya gönderiliyor HttpUrlConnection kullanarak base64 kodlu görüntüleri bir sunucuya göndermeye çalışıyorum. Sorun şu ki çoğu görüntünün başarıyla gönderildiğini, ancak bazılarının bir FileNotFound istisnası oluşturduğunu. Resmi kodlama kodum aşağıda bulunabilir.HttpUrlConnection Android

String imageEncoded = Base64.encodeToString(b,Base64.URL_SAFE); 

için: Çizgiyi değiştirdiğinizde

public static String encodeImage(Bitmap thumbnail) { 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      byte[] b = baos.toByteArray(); 
      String imageEncoded = Base64.encodeToString(b,Base64.URL_SAFE); 
      return imageEncoded; 
     } 

String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT); 

sonra en görüntüleri FileNotFoundException üretmek ve bazı başarılı sunucuya gönderilir. Herhangi bir yardım takdir edilecektir

public class HttpManager { 

    public static String getData(RequestPackage p) { 

     BufferedReader reader = null; 
     String uri = p.getUri(); 
     if (p.getMethod().equals("GET")) { 
      uri += "?" + p.getEncodedParams(); 
     } 

     try { 
      URL url = new URL(uri); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      con.setRequestMethod(p.getMethod()); 


      if (p.getMethod().equals("POST")) { 
       con.setDoOutput(true); 
       OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream()); 
       writer.write(p.getEncodedParams()); //Url encoded parameters 
       writer.flush(); 
      } 

      StringBuilder sb = new StringBuilder(); 
      reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

      String line; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 

      return sb.toString(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } finally { 
      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        return null; 
       } 
      } 
     } 

    } 

} 

:

aşağıda benim HttpUrlConnection kodudur. Teşekkürler

+0

Neden Base64? – pskink

+0

Görüntü bitmap değeri daha büyükse bitamp azaltmaya çalışın. –

+0

aslında, sorun sunucu tarafında yatıyor ... prolly, sunucu blokları çok büyük istekler ... hala neden yerine düz ikili göndermiyorsunuz anlamıyorum ... – Selvin

cevap

2

Aynı problem vardı. Aşağıdaki kodu kullanmanız yeterlidir:

public class MainActivity extends AppCompatActivity { 

int SELECT_PICTURE = 101; 
int CAPTURE_IMAGE = 102; 
Button getImage; 
ImageView selectedImage; 
String encodedImage; 
JSONObject jsonObject; 
JSONObject Response; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getImage = (Button) findViewById(R.id.get_image); 
    selectedImage = (ImageView) findViewById(R.id.selected_image); 

    final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
    builder.setTitle("Profile Picture"); 
    builder.setMessage("Chooose from?"); 
    builder.setPositiveButton("GALLERY", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(intent, SELECT_PICTURE); 
     } 
    }); 
    builder.setNegativeButton("CANCEL", null); 


} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Check which request we're responding to 
    if (requestCode == SELECT_PICTURE) { 
     // Make sure the request was successful 
     Log.d("Vicky","I'm out."); 
     if (resultCode == RESULT_OK && data != null && data.getData() != null) { 
      Uri selectedImageUri = data.getData(); 
      Bitmap selectedImageBitmap = null; 
      try { 
       selectedImageBitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImageUri); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      selectedImage.setImageBitmap(selectedImageBitmap); 
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
      selectedImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); 
      byte[] byteArrayImage = byteArrayOutputStream.toByteArray(); 
      encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT); 
      Log.d("Vicky","I'm in."); 
      new UploadImages().execute(); 
     } 
    } 
} 

private class UploadImages extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      Log.d("Vicky", "encodedImage = " + encodedImage); 
      jsonObject = new JSONObject(); 
      jsonObject.put("imageString", encodedImage); 
      jsonObject.put("imageName", "+917358513024"); 
      String data = jsonObject.toString(); 
      String yourURL = "http://54.169.88.65/events/eventmain/upload_image.php"; 
      URL url = new URL(yourURL); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setDoInput(true); 
      connection.setRequestMethod("POST"); 
      connection.setFixedLengthStreamingMode(data.getBytes().length); 
      connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); 
      OutputStream out = new BufferedOutputStream(connection.getOutputStream()); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); 
      writer.write(data); 
      Log.d("Vicky", "Data to php = " + data); 
      writer.flush(); 
      writer.close(); 
      out.close(); 
      connection.connect(); 

      InputStream in = new BufferedInputStream(connection.getInputStream()); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        in, "UTF-8")); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
      in.close(); 
      String result = sb.toString(); 
      Log.d("Vicky", "Response from php = " + result); 
      //Response = new JSONObject(result); 
      connection.disconnect(); 
     } catch (Exception e) { 
      Log.d("Vicky", "Error Encountered"); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void args) { 

    } 
    } 
} 
+0

Teşekkürler, bu bana yardımcı oldu! – Martin

+0

@Martin Size yardımcı olduğundan memnun oldum. – Vicky

+0

@Martin Ama bu cevap güncel değil, lütfen bu https://futurestud.io/tutorials/retrofit-2-how-to-upload-files-to-server – Vicky

1

Varsayılan DEFAULT alfabesinin içinde bir '/' harfi vardır. Başka bir deyişle, Base64.encodeToString (b, Base64.DEFAULT) çalıştırdığınızda, sonuçta '/' ler ile sonuçlanır. Sunucu tarafında HTTP istek yolunuzdaki yolu iki kez kontrol ederim.

+0

Haklısınız Base64.encodeToString (b, Base64.DEFAULT) 'url güvenli değildir. Son zamanlarda bunu bilmek için geldim. – Vicky

İlgili konular