2013-11-20 2 views
6

У меня есть SOAP API, который возвращает мне файл, разделенный на куски, закодированных в нескольких base64 строкиСохранение ByteArray, в PDF-файл в Titanium

я не в состоянии сохранить его в файловой системе, не нарушая его

This is the pastebin всего файла, закодированного, как есть, после загрузки и цепочки ответов.

Каков способ его сохранить правильно?

я пытался во многих отношениях

var f = Ti.FileSystem.getFile(Ti.FileSystem.tempDirectory, 'test.pdf'); 

...

var blobStream = Ti.Stream.createStream({ source: fileString, mode: Ti.Stream.MODE_READ }); 
    var newBuffer = Ti.createBuffer({ length: fileString.length }); 

    f.write(fileString); 

или

var data = Ti.Utils.base64decode(fileString); 

    var blobStream = Ti.Stream.createStream({ source: data, mode: Ti.Stream.MODE_READ }); 
    var newBuffer = Ti.createBuffer({ length: data.length }); 
    var bytes = blobStream.read(newBuffer); 

    f.write(fileString); 

или

var data = Ti.Utils.base64decode(fileString); 

    var blobStream = Ti.Stream.createStream({ source: data, mode: Ti.Stream.MODE_READ }); 
    var newBuffer = Ti.createBuffer({ length: data.length }); 
    var bytes = blobStream.read(newBuffer); 

    f.write(bytes); 

, но я не понимаю, какой из них правильный путь

Должен ли я преобразовать обратно в byteArray строку самостоятельно? Каков правильный способ его сохранения?

Должен ли я создать буфер из строки или ...?

+0

Во всех ваших примерах вы ссылаетесь на 'f', что это? Файл? FileStream? –

+0

Я редактирую, я даю ему файл – Zerho

ответ

1

Я думаю, что base64enc для файла является недопустимым или неполным, я тестировал его с использованием bash и base64 utils. Вы можете выполнить эти действия.

Скопируйте и вставьте строку base64 на файл с именем pdf.base64 затем запустить эту команду:

cat pdf.base64 | base64 --decode >> out.pdf 

выходной файл не является действительным PDF.

Вы можете попробовать кодировать и декодировать действительный файл в формате PDF, чтобы взглянуть на сгенерированный двоичный:

cat validfile.pdf | base64 | base64 --decode >> anothervalidfile.pdf 

Try, чтобы проверить, если вы правильно chainig куски или просто сделать телефонный звонок с парнем, который постройте мыло api.

1

Перед тем, как начать загрузку файла вам необходимо создать файла потока для записи тоже писать в сгусток не путь:

// Step 1 
var outFileStream = Ti.Filesystem.getFile('outfile.bin').open(Ti.Filesystem.MODE_WRITE); 

После создания HTTPClient или поток сокета и когда вы получаете кусок данных Base64 из сервиса, вам нужно поместить эти декодированные данные в Titanium.Buffer. Это, вероятно, войдет в Ваш OnLoad или с в HTPPClient,:

// Step 2 
var rawDecodedFileChunk = Ti.Utils.base64decode(fileString); 
var outBuffer = Ti.createBuffer({ 
    byteOrder : // May need to set this 
    type :  // May also need to set this to match data 
    value: rawDecodedFileChunk 
}); 

Наконец, вы можете записать данные, чтобы поток файла:

// Step 3 
var bytesWritten = outFileStream.write(outBuffer); // writes entire buffer to stream 
Ti.API.info("Bytes written:" + bytesWritten); // should match data length 
if(outBuffer.length !== bytesWritten) { 
    Ti.API.error("Not all bytes written!"); 
} 

Обычно ошибки приходят от того, неправильного порядка байт или тип данных или запись в неправильном порядке. Очевидно, что все это зависит от сервера, отправляющего данные в правильном порядке, и это действительно!

Возможно, вы также захотите рассмотреть the pump command версию этого, которая позволяет вам передавать из потока ввода в выходной поток файлов, сводя к минимуму вашу нагрузку.

+0

Спасибо за полный вопрос, к сожалению, способ писать был легко, ошибка была в API – Zerho

Смежные вопросы