HttpUrlConnectionを使用してbase64でエンコードされた画像をサーバーに送信しようとしています。私が抱えている問題は、ほとんどの画像が正常に送信されることですが、FileNotFound例外を生成するものもあります。画像をエンコードするための私のコードは以下にあります。
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を生成し、一部はサーバーに正常に送信されます。
以下は私の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;
}
}
}
}
}
どんな助けでもありがたいです。ありがとう
私も同じ問題を抱えていました。以下のコードを使用するだけで問題ありません。
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) {
}
}
}
デフォルトのDEFAULTアルファベットには、おそらく「/」が含まれています。つまり、Base64.encodeToString(b、Base64.DEFAULT)を実行すると、結果に「/」が含まれることになります。サーバー側のHTTPリクエストパスのパスを再確認します。
このトリックは私の命を救った。マルチパートデータ(これは必要ありません)を除いて、できる限りのことを試しました。私の画像は、さまざまなエンコーディング、Base64エンコードタイプなどで壊れていました。したがって、トリックは、エンコードされた画像文字列にURLEncoderを使用することです。
String params = "img=" + URLEncoder.encode(base64_img_str, "UTF-8") + "¶m=" + String.valueOf(someParam);
そして、これを(HttpURLConnectionを使用して)送信します。
OutputStream os = conn.getOutputStream();
data = params.getBytes("UTF-8");
os.write(params);
os.flush();