2013-11-20 22 views
6

mam API SOAP że wraca mi plik podzielony na kawałki kodowanych w kilku ciągów base64Saving tablicaBitowa do pliku pdf z tytanu

Nie jestem w stanie zapisać go do systemu plików bez łamania go

całego zakodowanego pliku, tak jak po pobraniu i połączeniu odpowiedzi.

Jaki jest sposób, aby zapisać go poprawnie?

próbowałem na wiele sposobów

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

lub

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

lub

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

ale nie rozumiem, która z nich jest właściwą ścieżką

Czy muszę przekonwertować z powrotem na byteArray ciąg na własną rękę? Jaki jest właściwy sposób, aby go zapisać?

Czy muszę utworzyć bufor z ciągu znaków lub ...?

+0

We wszystkich swoich przykładach odwołujesz się do 'f', co to jest? Plik? FileStream? –

+0

Edytuję, podaję plik – Zerho

Odpowiedz

1

Myślę, że base64enc dla pliku jest niepoprawny lub niekompletny, przetestowałem go za pomocą narzędzi bash i base64. Możesz wykonać te kroki.

Kopiuj i wklej ciąg base64 na plik o nazwie pdf.base64 następnie uruchomić polecenie:

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

plik wyjściowy nie jest poprawnym pdf.

Można spróbować kodowania i dekodowania poprawny plik pdf do przyjrzeć generowany binarny:

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

próby sprawdzenia jeśli chainig kawałki poprawnie lub po prostu zatelefonować z facetem, który zbuduj mydło api.

1

Przed rozpoczęciem pobierania pliku musisz utworzyć plik strumień napisać też, pisząc do kropelka nie jest do zrobienia:

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

Po utworzeniu HTTPClient lub strumień gniazdo i kiedy Otrzymujesz fragment danych Base64 z servera, musisz umieścić te dekodowane dane w postaci Titanium.Buffer. To prawdopodobnie iść do swojego onload lub OnStream w 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 
}); 

Wreszcie można zapisywać dane do pliku stream:

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

Generalnie błędy pochodzą z posiadania złego Byte Order lub rodzaj danych lub pisanie w złej kolejności. Oczywiście wszystko to zależy od tego, czy serwer przesyła dane w poprawnej kolejności i jest ważny!

Możesz również rozważyć wydanie wersji the pump command, która umożliwia przesyłanie ze strumienia wejściowego do strumienia plików wyjściowych, minimalizując obciążenie.

+0

Dziękuję za pełne pytanie, niestety sposób pisania był prosty, błąd był w API – Zerho