2013-11-20 40 views
6

ho un'API SOAP che mi sta tornando un file diviso in blocchi codificati in diverse stringhe base64Salvataggio ByteArray di file pdf in titanio

io non sono in grado di salvare il file system senza romperlo

This is the pastebin di un intero file codificato, così come è, una volta che ho scaricato e concatenato le risposte.

Qual è il modo per salvarlo correttamente?

che ho provato in molti modi

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); 

o

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); 

o

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); 

ma non capisco quale è la strada giusta

Devo riconvertire a byteArray la stringa da solo? Qual è il modo giusto per salvarlo?

Devo creare un buffer dalla stringa o ...?

+0

In tutti gli esempi si fa riferimento a 'f', che cos'è? Un file? FileStream? –

+0

I editet, gli sto dando un file – Zerho

risposta

1

Penso che la base64enc per il file non sia valida o incompleta, l'ho provata utilizzando i programmi di utilità bash e base64. È possibile eseguire questi passaggi.

Copia e incolla la stringa base64 in un file chiamato pdf.base64 quindi eseguire il seguente comando:

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

il file di output non è un PDF valido.

Si può cercare di codificare e decodificare un file PDF valido per dare un'occhiata al binario generato:

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

prova a controllare se si è chainig correttamente pezzi o semplicemente fare una telefonata con il ragazzo che costruisci la soap api.

1

Prima di iniziare a scaricare il file è necessario creare il file flusso di scrivere troppo, scrivendo a un blob non è la strada da percorrere:

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

Dopo aver creato il vostro HTTPClient o flusso di presa e quando si riceve una porzione di dati Base64 dal servizio, è necessario inserire i dati decodificati in uno Titanium.Buffer. Questo sarebbe probabilmente andare nella vostra onload o onstream in un 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 
}); 

Infine è possibile scrivere i dati verso il flusso di file:

// 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!"); 
} 

Generalmente gli errori provengono da avere l'ordine dei byte sbagliato o tipo di dati o scrittura nell'ordine sbagliato. Ovviamente, tutto dipende dal server che invia i dati nell'ordine corretto ed è valido!

Si potrebbe anche prendere in considerazione la versione the pump command di questo, che consente di trasferire dal flusso di input al flusso di file di output, riducendo al minimo il carico.

+0

Grazie per la domanda completa, sfortunatamente il modo di scrivere è stato facile, l'errore era nell'API – Zerho