首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用base 64对图像进行编码,并在android中使用retrofit 2将其发送到服务器

如何使用base 64对图像进行编码,并在android中使用retrofit 2将其发送到服务器
EN

Stack Overflow用户
提问于 2016-08-09 11:01:14
回答 2查看 1.3K关注 0票数 0

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

代码语言:javascript
运行
复制
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方法是这样的

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@POST("api/Statement")
Call<Integer> savePoll(@Body Statment poll);

我有这门课

代码语言:javascript
运行
复制
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;
}
}

当我发布时,它总是从服务器返回一个错误,我试图控制这个字符串,我得到了这个错误。

代码语言:javascript
运行
复制
{"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很好地编码和解码图像。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-11 14:42:46

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

代码语言:javascript
运行
复制
image.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOS);
票数 1
EN

Stack Overflow用户

发布于 2016-08-09 11:50:17

当您使用Base64对图像进行编码时,它如下所示:

代码语言:javascript
运行
复制
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,的存在,它将无法解码。请确保在编码后和将请求发送到服务器之前删除它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38848954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档