1

としてエンコードされたインターネット経由で新しいファイルを送信することを目的とした ASP.Net Web API があります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);
    }

Stringsは、Web サービスから取得したものです。

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 に答える