Кодирование base64 в Java и декодирование в C # - PullRequest
4 голосов
/ 05 августа 2010

Мне нужно отправить файл в мой веб-сервис, но веб-сервис принимает файл (массив байтов) как base64Binary.

Перед кодированием файл byteArrayFile сохраняется на диске как обычный файл.(Я делаю это только для тестирования)

Итак, в моем клиенте Java для веб-службы я отправляю информацию следующим образом:

String file = new sun.misc.BASE64Encoder().encode(byteArrayFile);
port.sendFileToWebService(file);

Веб-служба должна декодировать информациюи сохраните полученный файл на диске.

    [WebMethod]
    public string sendFileToWebService(string file)
    {

        string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\";
        if (!System.IO.Directory.Exists(dirname))
        {
            System.IO.Directory.CreateDirectory(dirname);
        }
        string filename = dirname + "/" + "file.sim";
        WebClient myWebClient = new WebClient();
        myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        byte[] byteArray = null;

        byteArray = Convert.FromBase64String(file.Replace("\n", ""));

        byte[] responseArray = myWebClient.UploadData(filename, "POST", byteArray);
        return "Webservice says OK";
    }

Проблема:

Файл, сохраненный на диске (до кодирования), и файл, декодированный с помощью C #, не равны.Я не знаю, если это проблема в кодировке Java или C #.

Любые предложения, включая изменение типов файлов или логический процесс, всегда будут оценены.

Заранее спасибо!

EDIT - Сравнение файлов:

Исходный файл http://img819.imageshack.us/img819/820/originalu.png

Декодированный файл (после кодировки Java) http://img826.imageshack.us/img826/3184/processed.png

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

Я знаю, что стандарт XSD определяет тип данных с именем base64Binary .Это должно учитывать, что ваш [WebMethod] параметр должен быть byte[].Затем базовый стек служб закодирует массив байтов в строку base64.

Например, я только что сделал быстрый Java-сервис, подобный этому

   @WebMethod(operationName = "TestByteArray")
    public void testByteArray(byte[] data) {

    }

И соответствующие части сгенерированного WSDLвыглядеть так:

<operation name="TestByteArray">
    <input wsam:Action="jordan.services/EncodingTests/TestByteArrayRequest" message="tns:TestByteArray"/>
    <output wsam:Action="jordan.services/EncodingTests/TestByteArrayResponse" message="tns:TestByteArrayResponse"/>
</operation>

И

<xs:complexType name="TestByteArray">
    <xs:sequence>
        <xs:element name="arg0" type="xs:base64Binary" nillable="true" minOccurs="0"/>
    </xs:sequence>
</xs:complexType>

Я также провел тест в .Net:

[WebMethod]
public void testByteArray(byte[] bytes) {
}

Соответствующие части сгенерированного WSDL:

<wsdl:portType name="TestWSSoap">
    <wsdl:operation name="testByteArray">
        <wsdl:input message="tns:testByteArraySoapIn"/>
        <wsdl:output message="tns:testByteArraySoapOut"/>
    </wsdl:operation>
</wsdl:portType>

А

<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
        <s:element name="testByteArray">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="bytes" type="s:base64Binary"/>
                </s:sequence>
            </s:complexType>
        </s:element>
        <s:element name="testByteArrayResponse">
            <s:complexType/>
        </s:element>
    </s:schema>
</wsdl:types>
1 голос
/ 05 августа 2010

Попробуйте использовать обычный файловый ввод / вывод вместо WebClient

public string sendFileToWebService(string file)
{

    string dirname = HttpContext.Current.Request.PhysicalApplicationPath + "\\Attachments\\";
    if (!System.IO.Directory.Exists(dirname))
    {
        System.IO.Directory.CreateDirectory(dirname);
    }
    string filename = dirname + "/" + "file.sim";
    byte[] byteArray = Convert.FromBase64String(file);
    File.WriteAllBytes(filename, byteArray ); //might wanna catch exceptions that could occur here
    return "Webservice says OK";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...