Как отправить двоичные данные в строке XML - PullRequest
7 голосов
/ 31 мая 2010

Я хочу отправить двоичный файл компоненту .net c # в следующем формате xml

<BinaryFileString fileType='pdf'>
    <!--binary file data string here-->
</BinaryFileString>

В вызываемом компоненте я буду использовать приведенную выше строку xml и преобразовать двоичную строку, полученную в теге BinaryFileString, в файл, указанный в атрибуте filetype = ''. Тип файла может быть doc / pdf / xls / rtf

У меня есть код в вызывающем приложении, чтобы получить байты из файла для отправки. Как мне подготовить его для отправки с тегами xml, обернутыми вокруг него? Я хочу, чтобы приложение отправляло строку компоненту, а не поток байтов. Это потому, что я никак не могу расшифровать тип файла [pdf / doc / xls], просто взглянув на поток байтов. Отсюда и строка xml с атрибутом filetype. Есть идеи по этому поводу?

метод извлечения байтов ниже

   FileStream fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read);
   using (Stream input = fs)
   {
      byte[] buffer = new byte[8192];
      int bytesRead;
      while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
      {}
   }
   return buffer;

Спасибо.

Edit:

Просто чтобы уточнить, почему я использую строку XML, а не задаю свойства для своего компонента. На самом деле мое приложение для вызова пытается смоделировать, как Siebel будет вызывать мой компонент. http://download.oracle.com/docs/cd/E05553_01/books/eScript/eScript_JSReference244.html#wp1014380 Я не уверен, что Siebel может установить свойства моих компонентов так, как мне нужно. Так что я работаю над углом отправки данных в формате XML.

Ответы [ 4 ]

7 голосов
/ 31 мая 2010

Представление Base64 универсально используется для представления двоичных данных.

public void EncodeWithString() {
    System.IO.FileStream inFile;     
    byte[] binaryData;

    try {
        inFile = new System.IO.FileStream(inputFileName,
                                          System.IO.FileMode.Open,
                                          System.IO.FileAccess.Read);
        binaryData = new Byte[inFile.Length];
        long bytesRead = inFile.Read(binaryData, 0,
                                    (int)inFile.Length);
        inFile.Close();
    }
    catch (System.Exception exp) {
        // Error creating stream or reading from it.
        System.Console.WriteLine("{0}", exp.Message);
        return;
    }

    // Convert the binary input into Base64 UUEncoded output.
    string base64String;
    try {
         base64String = 
            System.Convert.ToBase64String(binaryData, 
                                          0,
                                          binaryData.Length);
    }
    catch (System.ArgumentNullException) {
        System.Console.WriteLine("Binary data array is null.");
        return;
    }

    // Write the UUEncoded version to the XML file.
    System.IO.StreamWriter outFile; 
    try {
        outFile = new System.IO.StreamWriter(outputFileName,
                                    false,
                                    System.Text.Encoding.ASCII);             
        outFile.Write("<BinaryFileString fileType='pdf'>");
        outFile.Write(base64String);
        outFile.Write("</BinaryFileString>");
        outFile.Close();
    }
    catch (System.Exception exp) {
        // Error creating stream or writing to it.
        System.Console.WriteLine("{0}", exp.Message);
    }
}

На принимающей стороне вы можете отменить это и получить исходное содержимое файла, как указано ниже.

        // Convert the Base64 UUEncoded input into binary output.
        byte[] binaryData;
        try {
            binaryData = 
                System.Convert.FromBase64String(base64String);
        }
        catch (System.ArgumentNullException) {
            System.Console.WriteLine("Base 64 string is null.");
            return;
        }
        catch (System.FormatException) {
            System.Console.WriteLine("Base 64 string length is not " +
                "4 or is not an even multiple of 4." );
            return;
        }
4 голосов
/ 31 мая 2010

Можете ли вы BASE64 ваши байты? MSDN ref: Convert.ToBase64 , Convert.FromBase64String

3 голосов
/ 31 мая 2010

подробно @ russau's ответьте, что это будет работать так:

var s = "Hello World";
var b = Encoding.Default.GetBytes(s);
var bstr = Convert.ToBase64String(b);
Console.WriteLine("Original String:" + s);
Console.WriteLine("Base64 String:" + bstr);

var fromBStr = Convert.FromBase64String(bstr);
var st = Encoding.Default.GetString(fromBStr);
Console.WriteLine("Converted string: " + st);

Вам не понадобятся первые две строки:

var s = "Hello World";
var b = Encoding.Default.GetBytes(s);

как у вас уже есть байтовый массив. Я использовал строку, чтобы показать, что вы получите точно такое же значение, с которого вы начали в конце, когда вы конвертируете байтовый массив из Convert.FromBase64String

0 голосов
/ 31 мая 2010

Вы упоминаете, что вызываете компонент C #. Я не уверен, что понимаю, почему использование этого компонента означает, что вам нужно создать строку XML.

Можно ли определить классы для хранения ваших данных вместо использования строки XML? например,

public enum FileType
{
    Word,
    Excel,
    RichText,
    PDF
}

public class FileData
{
    public FileType TypeOfFile
    {
        get;
        set;
    }

    public byte[] Data
    {
        get;
        set;
    }
}

Тогда вызывающая сторона компонента просто устанавливает FileType и byte []. Тогда интерфейс компонента будет определен более явно (класс FileData, а не более общая строка или XmlDocument).

...