Вы используете data.writeObject(file);
. Это , а не случайные символы, это маркеры сериализации.
Вы не отправляете XML-документ на S3, вы отправляете сериализованный Actionscript XML
объект (в формате AMF3).
_bookXml.toXMLString()
выдаст вам XML-документ в виде строки. тогда вы сможете использовать ByteArray.writeMultiByte()
, чтобы получить то, что вы хотите. Посмотрите на следующий пример:
var test:XML = <test><data>Data</data></test>;
var serializeObject:ByteArray = new ByteArray();
serializeObject.writeObject(test);
trace(serializeObject.toString());
var rawString:ByteArray = new ByteArray();
rawString.writeMultiByte(test.toXMLString(), 'utf-8');
trace(rawString.toString());
Вывод:
�E<test>
<data>Data</data>
</test>
<test>
<data>Data</data>
</test>
Разница в том, что первым является сериализованный объект (который можно использовать .readObject()
для десериализации объекта из байтового массива обратно в XML
объект во флэш-памяти). Последний - это просто необработанные байты строки (в utf-8).
В вашем случае я бы предложил что-то вроде этого:
public function uploadObjectToS3(file:Object, objectName:String):void{
var data:ByteArray = new ByteArray;
data.writeObject(file);
data.position = 0;
uploadByteArrayToS3(data, objectName);
}
public function uploadXmlToS3(file:XML, objectName:String):void{
var data:ByteArray = new ByteArray;
data.writeMultiByte(file.toXMLString(), "utf-8");
data.position = 0;
uploadByteArrayToS3(data, objectName);
}
private function uploadByteArrayToS3(file:ByteArray, objectName:String):void{
//code to do s3 upload
}