Sending base64 encoded image to server using HttpUrlConnection Android

。_饼干妹妹 提交于 2021-02-18 22:01:51

问题


I'm trying to send base64 encoded images to a server using HttpUrlConnection. The problem I'm having is that most images gets sent successfully, however some generate a FileNotFound exception. My code for encoding the image can be found below.

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;
        }

When I change the line:

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

to:

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

then most images generate a FileNotFoundException and some gets sent to the server successfully.

below is the code for my HttpUrlConnection:

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;
                }
            }
        }

    }

}

Any help will be appreciated. Thanks


回答1:


I had the same problem. Just use the code below you will be fine:

 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) {

    }
  }
}



回答2:


The default DEFAULT alphabet probably has a '/' in it. In other words, when you run Base64.encodeToString(b,Base64.DEFAULT), you will end up with '/'s in the result. I would double check the path in your HTTP request path on the server side.




回答3:


This trick saved my life. I tried all I can, except of multipart data (don't need this). My images were broken with different encodings, Base64 encode types and so on. So the trick is to use URLEncoder for your encoded image string:

String params = "img=" + URLEncoder.encode(base64_img_str, "UTF-8") + "&param=" + String.valueOf(someParam);

And then just send this (using HttpURLConnection):

OutputStream os = conn.getOutputStream();
                data = params.getBytes("UTF-8");
                os.write(params);
                os.flush();


来源:https://stackoverflow.com/questions/30119382/sending-base64-encoded-image-to-server-using-httpurlconnection-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!