1

我有一个 ASP.Net web api,它旨在通过 Internet 发送一个新文件,编码为Base64. 为此,我有一个公开的 REST 服务:

    string imei = ControllerContext.Request.Headers.GetValues("IMEI").FirstOrDefault();
    byte[] FileAsBytes = null;
    String base64 = null;
    var svcs = new CrudService.CrudServiceClient();

    if (svcs.IsDeviceAccepted(imei))
    {
        FileAsBytes = svcs.DownloadSoftwareVersion();
    }

    if(FileAsBytes != null)
    {
         base64 = Convert.ToBase64String(FileAsBytes);
    }

    return base64;

还有一个私有服务,CRUD 服务,它直接与数据库和核心层进行通信。

经过一些调试后,我发现该服务返回了正确的长度,类似于4194304 bytes,这似乎与文件的大小相对应。但是在客户端,我在一个内部联系这个服务AsyncTask

    @Override
    protected String doInBackground(String... params) {
        Log.i("UpdateManager: ", "Inside doInBackground");

        try {

            String imei = params[0];
            String urlString = "http://10.118.18.50/Mobile.RESTPublicService/api/SoftwareUpdate";

            HttpPost post = new HttpPost(urlString);
            post.addHeader("IMEI", imei);
            response = httpClient.execute(post);

            Log.w("Update-Response: ",
                    Integer.toString(response.getStatusLine().getStatusCode())
                            + " " + response.getStatusLine());

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

                is = response.getEntity().getContent();
                IOUtils.copy(is, writer, "UTF-8");

                _log.debug(writer.toString());

                Log.w("CONTENT: ", writer.toString());
                byte[] result = new byte[MAX_FILE_SIZE]; //7242880 b
                result = decodeBase64(writer.toString());

                Log.w("BYTE ARRAY LENGTH: ", Integer.toString(result.length));

            }

        } catch (ClientProtocolException e) {
            Log.e("Client: ", e.getMessage());
            _log.error(e.getMessage());
            return FAILED_DUE_TO_EXCEPTION;
        } catch (IOException e) {
            Log.e("IO: ", e.getMessage());
            _log.error(e.getMessage());
            return FAILED_DUE_TO_EXCEPTION;
        }
        return response.getStatusLine().toString();
    }

这里有趣的一点是result = decodeBase64(writer.toString());decodeBase64 方法:

protected byte[] decodeBase64(String s) {
        return Base64.decode(s);
    }

字符串s是我从网络服务中得到的:

UEsDBBQACAgIAJteK0IAAAAAAAAAAAAAAAAZAAQAcmVzL2FuaW0vYWN0aXZpdHlmYWRlLnhtbP7KAABdkN9OwjAchc+PbW4YErnwgkRuuSGEek1MDI/SsMkmbF26es8D+AA+hs+hD6Wn0GXKab60/fq/ETK8CyCY4xNgL4TuCUPuyANZkEeyIXvySiaTqnGFbc1RO2MxHr9YU2+PbamRps5cWlmWv1ntKtNQ6ia3psqxXJbOtRul

这不是整个文件,但我可以看到这是base64 encoded

当这个字符串被传递给decodeBase64方法时,我只收到这个错误消息:

在此处输入图像描述

然后应用程序终止。这是处理Base64字符串的方法吗?有人可以建议我如何从这个base64字符串创建一个文件吗?我的第一个想法是将其转换为byte数组,然后创建一个文件。

4

1 回答 1

1

在我看来,您在那里有一个带引号的字符串 - 因为"似乎是让它爆炸的原因。Web 服务是否返回 JSON 字符串?如果是,那么它将被引号包围,您必须将其去掉才能从 base 64 解析它。

于 2013-01-14T09:05:15.003 回答