我有一个AsyncTask,看起来像这样:
protected Void doInBackground(Void... notUsed) {
/************ Make Post Call To Web Server ***********/
BufferedReader reader = null;
// Send data
try {
// Defined URL where to send data
URL url = new URL("http://www.maarten-vandeperre.be/demo/server_lokeren_POST.php");
// Send POST data request
String data ="&" + URLEncoder.encode("data", "UTF-8") + "=";
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
writeNotifications(wr);
//wr.write( data + "data" );
//writeNotifications(wr);
wr.flush();
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while((line = reader.readLine()) != null) {
// Append server response in string
sb.append(line);
}
// Append Server Response To Content String
Log.i(TAG, "server response: " + sb.toString());
action.doAction();
}
catch(Exception e){
Log.e(TAG, Log.getStackTraceString(e));
error = e.getMessage();
}
finally{
try{
reader.close();
}
catch(Exception ex) {}
}
/*****************************************************/
return null;
}
和writer方法,其中base64编码的方法如下:
private void writeNotificationData(JsonWriter writer) throws IOException {
writer.beginObject();
writer.name("comment").value(notification.getComment());
writer.name("category").value(getCategory(notification.getCategoryId()));
writer.name("urgency").value(getUrgency(notification.getUrgencyId()));
writer.name("street").value(notification.getAddress().getStreet());
writer.name("houseNumber").value(notification.getAddress().getHouseNumber());
writer.name("latitude").value(notification.getAddress().getPosition().latitude);
writer.name("longitude").value(notification.getAddress().getPosition().longitude);
Log.i(TAG, "write image urls: " + notification.getImageUrls());
if(notification.getImageUrls() != null && notification.getImageUrls().size() > 0) {
String base64 = encodeToBase64(notification.getImageUrls().get(0));
Log.i(TAG, "image to base64: " + base64);
writer.name("image").value(base64);
}
writer.endObject();
}
private String encodeToBase64(final String url) {
ByteArrayOutputStream bao = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeFile(url);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bao);
byte [] ba = bao.toByteArray();
String ba1= Base64.encodeToString(ba, Base64.NO_WRAP);
return ba1;
}
当我不发送base64字符串,但是随机发送一个字符串(RandomStringUtils.randomAlphabetic(2000))时,我会在服务器日志中看到它。 当我使用上面发布的代码时,没有任何内容弹出。 我在某处错过了编码/解码吗?
这是服务器收到的字符串:
MSOImVAPfCBGNDXJNuHtFGhmtiUqQXJSlstpcEaGUYyyVeOezyyJsqeJxvlorvFMDxGtbIPMXRyvDSmUZuQadaAFzGdVFBfObiTHLTkuvweKpEylfWEBUhCqaCpBUQUjdTNbXzXTJWqLWDanhHimJoaPNtthENmMUYbxVCKUYVQdqVdbZyewRIArgcCHvLhioCAjqUswiZNxoXwzVQCwGSHpvBRLKEcsLhfFUHcyAtUQmHHQUzZBapcNhLpxJAuasXuAuzaxqBiaQhiKGTvNOGSeNNZRBAYCLIosrzkIYZElFgRiVbYqebKmBEXxBDxbCFdIIXPEZhruKVLLIBfsImlFevGaWouUYSbMITTDPVlcEmsTPDekEVwCOmpHfmUwFQlFDYzUenRAxBHgLIUqRgETQexKViWyNMCycRJLUehSWLNGSNGpOUIrPILfXVkUDfEQHkOKwcOkoTAWGZvjivNJNRkipecNcLTOYazuhKOLODmYFgkfQhpzImQQLBVBelRtMXtaSFLCeMXptiYrMSQqkEYocPKYBSizkzTmXYQTARzqmvGdwQbLiMiNKWNkJQkYtsCZAzCZbVHFmHcdtQCbgbypBZadzIAaSFgoikiVnRVmshxoikqKnulgPPPgJkwTIlRwsGkLFbZTPCPXkCvpRMYZiNnzpTuAbEKtmwgLkukPjjeDPiHuvVbkgDgHYQffGJoZirxRaRblJNkVGfSNWJsETcXYRrdySFlyclnlzzMmAdLKKIbvjVaxrzaBiUujbEyFESqpvUBAMpLzisMIsekJuhIDnKpdhDsnmvHYhmaFlKzkDDUHAkTAtfzbUGXIuuMECYYYgbJHwNTYWEjAxFLtjIoQDckqFjOxuYVMkEyidjkXojXznPybymUqZFuhvGNLNHgZnNjJoHJsIEyDeyhbaKOGGTQxunIOCtbgkgIBnWpSFDsgeDjoZPsYcaxYayRJGemFqzjMLUEKXwLKziotjPMwCXGUeCffeIropZVZvdHZwIrYPHHElggBOvgpvRvpQkKzmukbulMuAuWsoonOxTDjLFiHDdCTSwcFgpqbkgOKkDeNyhAQUfWuQGhpOsEbOIOAkMbxbJMMtMQjdEJEPGYGSHcXWrEHWYQEaBdgkiISLGRfKKMHcVYnuJkRSawATXcGofvrFXSnvpauiylCkARfmpWrYJgYGBlfcNOoiLskrODiBQdxgjfyTjSzWsCDYJmbACWODmnSejxNacLzvCyJNwaatFbrgAAUXjJRTOWdIwjBGJogHiGeIsCbmOtWrsSIUSXKLseLARonSejvwShpPritPsSutLCFpPktbFJWVfqHuFHWLUfXCRmXOOCcEPAVKkinMyKYlpCWfBfngCnWrTFjnmteCBFqhtfWCQOBmmXdaNkCRrAXuPsHLLTrXauYXVnrvPgEvyXyULEALBMDJxTNaxrBYuNFySOYRFBvTsgqqKqpkagVyZiGhLSvXNJcOADsVBEfuLBxsFiHpoohECJvARBReiRkBvgMhaEnUWIzZEzPVvxiaiWhXMTTJJqQbmnjvbZlhZGJQoTRjjoixTcAxVeCFbfapaiCiAgRMVknMQYFTCDjRbAhjygnzCWtwivVKPpnpbWKBjgJuNGGcOKZfsrrXLWUpRGDxrpwwsSwNbnIyunuSVJkUjKxNARgHFlNZuSxZQWcbAHRzaKHSARRWjolMsmNTrUjVQulaFvSYocgnWAxYBnRhIxzNRVygBDXNjmuFPpxAnaDUsmlXZyZNFAwmrYQoGZzSMFdBeXYJPYwLqaSgbevXvtauVOZjMvTxZpffIauMeOFVQEYgzvLSxVraweqmIHxCNUyWKFTvrcjlmuJJsgTWaDutXKYGLViQzNUynFjIKCWaRqvfGIFYaKFgFUXVYknPLvxlyiVALQIGxeKKLdjJLUXJxTfceuakyVPVFEVbxadTagbjSoBLXqBVmfdwIzJKvnKyqyaulbZFIpFxicJSvwBJLgnmpnZ
这是服务器无法接收的字符串(Base64):
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
我现在坚持这个,而stackoverflow上的其他答案似乎无法解决问题......
答案 0 :(得分:0)
使用“encodeToBase64”的这个实现解决了它。正如greenapps建议的那样,我们不应该使用位图来获取图像文件的字节。
private String encodeToBase64(final String url){
try {
File file = new File(url);
byte[] bFile = new byte[(int) file.length()];
FileInputStream inputStream = new FileInputStream(url);
inputStream.read(bFile);
inputStream.close();
return Base64.encodeToString(bFile, Base64.NO_WRAP);
} catch (IOException e) {
Log.e(TAG, Log.getStackTraceString(e));
}
return null;
}