问题
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") + "¶m=" + 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