使用HttpUrlConnection Android将base64编码的图像发送到服务器 [英] Sending base64 encoded image to server using HttpUrlConnection Android

查看:40
本文介绍了使用HttpUrlConnection Android将base64编码的图像发送到服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用HttpUrlConnection将base64编码的图像发送到服务器.我遇到的问题是大多数图像都能成功发送,但是有些图像会生成FileNotFound异常.我的图像编码代码可以在下面找到.

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

当我换行时:

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

收件人:

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

然后大多数图像会生成FileNotFoundException,并且某些图像会成功发送到服务器.

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

下面是我的HttpUrlConnection的代码:

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

推荐答案

我遇到了同样的问题.只需使用下面的代码,您就可以了:

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

    }
  }
}

这篇关于使用HttpUrlConnection Android将base64编码的图像发送到服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆