我正在使用我在网上找到的代码对图像进行编码。
try {
InputStream inputStream = new FileInputStream(photoFile.getPath());
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
bytearrayoutputstream = new ByteArrayOutputStream();
while((bytesRead = inputStream.read(buffer)) != -1){
bytearrayoutputstream.write(buffer, 0, bytesRead);
}
bytes = bytearrayoutputstream.toByteArray();
encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
Log.d("BASE64", encodedString);
savePhoto();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我的savePhoto方法是这样的
public void savePhoto() {
Statment state = new Statment(0, "", encodedString);
saveStatement = classApi.saveStatement(state);
saveStatement.enqueue(new Callback<Integer>() {
@Override
public void onResponse(Call<Integer> call, Response<Integer> response) {
if (response.code() == 200) {
Toast.makeText(MainActivity.this, "Satement " , Toast.LENGTH_LONG).show();
Log.e("Saved", response.body().toString());
} else {
Toast.makeText(MainActivity.this, "Error code: " + response.code(), Toast.LENGTH_LONG).show();
Log.e("ERROR", call.request().url().toString());
}
}
@Override
public void onFailure(Call<Integer> call, Throwable t) {
Toast.makeText(MainActivity.this, "Failed: " + t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
Log.e("ERROR", t.getLocalizedMessage());
Log.e("ERROR", call.request().url().toString());
}
});
}
我的帖子是这样的,它总是为了成功而返回1
@POST("api/Statement")
Call<Integer> savePoll(@Body Statment poll);
我有这门课
public class ApiClient {
private static final String BASE_URL = "http://post.url";
private static Retrofit retrofit = null;
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
public static Retrofit getRetrofit(){
if(retrofit == null){
OkHttpClient client = httpClient.build();
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
}
return retrofit;
}
}
当我发布时,它总是从服务器返回一个错误,我试图控制这个字符串,我得到了这个错误。
{"Message": "An error has occurred.",
"ExceptionMessage": "Invalid length for a Base-64 char array or string.",
"ExceptionType": "System.FormatException",
"StackTrace": " at System.Convert.FromBase64_Decode(Char* startInputPtr, Int32 inputLength, Byte* startDestPtr, Int32 destLength)\r\n at System.Convert.FromBase64CharPtr(Char* inputPtr, Int32 inputLength)\r\n at System.Convert.FromBase64String(String s)\r\n at Admin.Api.Controllers.StatementPollController.PostStatementPoll(StatmtPoll ObjstatementPoll) in c:\\mvc dev\\ECService\\Admin.Api\\Controllers\\StatementPollController.cs:line 37\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
但是我能够使用java很好地编码和解码图像。
发布于 2016-08-11 14:42:46
感谢大家宝贵的时间。我的问题是文件太大,所以服务器拒绝它。然后,我将图像压缩为50,因为字节长度几乎达到50 to。
image.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOS);
发布于 2016-08-09 11:50:17
当您使用Base64对图像进行编码时,它如下所示:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAJOjAACTowHRsvDGAAAAB3RJTUUH4AUXFRkcSlLFuAAAA8BJREFUeNrt2sFx6kAQRVGGEMhB6UywpEMOk4JIQBshgeh556x+1d+4pO7rxnZb1/VWweP1rPGFsstYevMUrtOqBEAMRAEBEAIxQACEQAwQACEQAwRACIQAARACIUAAREAIEAAhEAIEQAhEAAEQASFgw91AIPguAIOB+AuAECACPgIYCATfBWAwEH8XgGFA9AVABBABARABREAAQAQEwBWACAiACCACAiACiIAAAALgCsAVIAAigAgIAIiAALgCQADAFSAArgBEQAAAAXAF4AoQAEAAXAG4AgQAREAAXAEgAIAAgI8BAgAIgJ8D4AoQAEAAwBUgAD4GgAAAAgA+BggAIAB+DgACAOkfAwQAXACAAAACAGT8HEAATuQ3AbgAAAEABAAQAEAAAAGAmVX6VaAAgAsAEABAAAAB4AP+HBgBAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAQAEABAAAABAAEABACOGktvY+nNkxAAApd/698IAEHL7xoQAMKXf8//IwBMuvwiIACEL78ICADhyy8CAsAki390iUVAAAj6ri8CAoDl/8o1gQBQcPldAwKA5RcBASB9+UVAAAhffhEQAP5k8a9eQhEQAMIXTwQEgPCF82tCAcB3W9eAAJC+XCIgAIQvlQgIAOHLJAICwMEFqr5EIiAAhC+OCAgA4QsjAgJA+KL4WwEBwHdJ14AAkL4UIiAAhC+DCAiA5Q9fAhEQgNjBN/wiIAAGHs9EAAw6riIBsPx4TgJgqD0vz0sADLPnhgAYYs8PASg3uIZXBATAwOKZCoBBxVUlAJYfz1kADCWetwAYRjx3ATCEeP4CUG7wLL8ICICBwzsRAIOGq0wALD/ekwAYKrwvATBMeG8CYIjw/gSg3OBYfhEQAAODdyoABgVXnQBYfrxnATAUeN+/9gZBC2sqNVymHwAAAABJRU5ErkJggg==
在您的C# web服务中,由于data:image/png;base64,
的存在,它将无法解码。请确保在编码后和将请求发送到服务器之前删除它。
https://stackoverflow.com/questions/38848954
复制相似问题