2013-11-20 66 views
6

PDF文件我有一個SOAP API是返回我在幾個的base64字符串保存ByteArray的在鈦

我不是能夠把它保存到文件系統編碼塊劃分的文件沒有打破它

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

我editet,我給它一個文件 – Zerho

回答

1

我認爲該文件的base64enc無效或不完整,我使用bash和base64 utils對其進行了測試。您可以執行這些步驟。

複製並粘貼上一個名爲pdf.base64以base64字符串,然後運行這個命令:

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

輸出文件是不是有效的PDF。

您可以嘗試進行編碼和解碼的有效PDF文件看看所生成的二進制:

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

嘗試檢查您是否正確chainig塊或簡單地使與人的電話誰建立肥皂api。

1

開始之前下載你的文件,你需要創建文件流寫入過,寫一個blob是不是要走的路:

// 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