Я хочу отправить двоичный файл в компонент .net c# в следующем xml формате
В названном компоненте я буду использовать вышеупомянутое xml, представляют в виде строки и преобразовывают двоичную строку, полученную в теге BinaryFileString, в файл, как указано типом файла ='' атрибут. Типом файла мог быть doc/pdf/xls/rtf
У меня есть код в вызывающем приложении для ухода байтов из файла, который будет отправлен. Как я готовлюсь, это, чтобы быть отправленным с тегами XML перенесло его? Я хочу, чтобы приложение отослало строку в компонент и не поток байтов. Это вызвано тем, что нет никакого способа, которым я могу дешифровать тип файла [pdf/doc/xls] только путем рассмотрения потока байтов. Следовательно xml представляют в виде строки с атрибутом типа файла. Какие-либо идеи об этом?
метод для извлечения Байтов ниже
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;
Спасибо.
Просто для уточнения, почему я использую строку xml вместо того, чтобы установить свойства на моем компоненте. На самом деле мое приложение вызова пытается моделировать, как Siebel назовет мой компонент. http://download.oracle.com/docs/cd/E05553_01/books/eScript/eScript_JSReference244.html#wp1014380 я не уверен, может ли Siebel установить мои свойства компонентов, поскольку мне нужна она к. Таким образом, я работаю над углом его отправляющий данные в xml.
Представление 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;
}
Вы можете BASE64 свои байты? MSDN ref: Convert.ToBase64, Convert.FromBase64String
в дополнение к @ russau ] ответ будет работать следующим образом:
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
Вы упомянули, что вызываете компонент 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).