如何使用 base 64 编码图像并 POST 使用 android 中的改造 2 将其发送到服务器

how to encode an image with base 64 and POST it to a server using retrofit 2 in android

我正在使用我在网上找到的代码对图像进行编码

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

我的POST就是这样,它return总是成功1

@POST("api/Statement")
Call<Integer> savePoll(@Body Statment poll);

我有这个class

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

当我 post 它总是 return 来自服务器的错误我尝试控制字符串但我得到了这个错误

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

很好地编码和解码图像

当您使用 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# 网络服务中,由于 data:image/png;base64, 的存在,它将无法解码。 确保在编码之后和将请求发送到服务器之前将其删除。

谢谢大家的宝贵时间。 我的问题是文件太大,所以服务器拒绝了它。然后我将图像压缩到 50,因为字节长度接近 50mb

image.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOS);