簡體   English   中英

入隊到NSInputStream?

[英]Enqueueing into NSInputStream?

我想在NSInputStream中添加三個“部分”:NSString,另一個流的輸出,然后是另一個NSString。 這個想法如下:

第一個和最后一個NSStrings表示SOAP請求的開始和結束,而流的輸出是加載非常大的文件並將其編碼為Base64字符串的結果。 所以,最后我會讓最終的NSInputStream像這樣保存整個SOAP請求:

<soap beginning> <Base64編碼數據> <soap結束>

我希望整個請求保存在NSInputStream中的原因有兩個:

  1. 我不知道如何將非常大的數據文件加載到內存中
  2. 我認為這是強制在HTTP 1.1塊中發送最終請求的唯一方法(我需要它,否則,如果請求變得太大,服務器將不接受它)。 所以,我知道這樣做:

     NSInputStream *dataStream = ....; [request setHTTPBodyStream:dataStream]; 

確保請求將作為HTTP 1.1塊發送,而不是作為一個巨大的原始SOAP請求發送。

所以,我想知道如何實現這一點 - 即,我如何將事物“排入”NSInputStream? 甚至可以做到嗎? 還有另一種方法嗎?

僅供參考,在Java中可以如下完成

 Vector<InputStream> streamVec = new Vector<InputStream>();
 BufferedInputStream fStream = new BufferedInputStream(fileData.getInputStream());
 Base64InputStream b64stream = new Base64InputStream(fStream, true);
 String[] SOAPBody = GenerateSOAPBody(fileInfo).split("CUT_HERE");  
 streamVec.add(new ByteArrayInputStream(SOAPBody[0].getBytes()));
 streamVec.add(b64stream);
 streamVec.add(new ByteArrayInputStream(SOAPBody[1].getBytes()));
 SequenceInputStream seqStream = new SequenceInputStream(streamVec.elements());

因為Java有這些對象可用,但Objective-c中的NSStreams看起來像非常低級別的對象,並且很難使用。

注意:我完全重寫了原始問題,因為我在2天前問過它,因為我認為新編輯更清楚地解釋了問題所在。 我希望這將有助於它更容易理解,也許可以回答

更新2

以下是我迄今為止所能實現的目標:我使用臨時文件首先編寫<soap beginning>,然后設置輸入流來從文件中讀取,而不是嘗試排入流中。塊,將每個塊編碼為Base64字符串並將其寫入相同的臨時文件,最后,當我的流關閉時,我將<soap ending>寫入臨時文件。 然后我設置另一個輸入流與該文件的內容,我傳遞給NSMutableURLRequest:

        NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
        ...
        NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
        [request setHTTPBodyStream:dataStream];

這確保了HTTP 1.1分塊傳輸文件的內容。 連接完成后,刪除臨時文件。

這似乎工作正常,但當然這是一個煩人的工作。 我不想寫一個臨時文件,當它可以由流處理(理想情況下)。如果有人仍有更​​好的建議,請告訴我:)

更新3

好的,另一個更新是有序的。 雖然我的文件寫入似乎有效,但我現在遇到了一些意外問題,我的一些請求無法上傳到服務器。 具體來說,一切都按照計划進行,我正在將臨時文件的內容讀入流中,並將我的請求的HTTP主體設置為此流,並開始按我的意願傳輸HTTP 1.1塊 - 但對於某些一些數據包丟失的原因和最后的請求 - 這是我的猜測 - 變得格格不入,因此失敗。 我認為丟棄數據包的問題是隨機的,因為我在更大的請求上觀察它 - 也就是說,問題只是有更多機會出現 - 而我的較小請求通常會很好。 這當然是與此問題中的原始問題不同的問題。 如果有人知道可能導致這種情況的原因,我在這里詢問了問題: 在NSURLConnection發送的分塊HTTP 1.1請求期間丟棄了數據包

您的解決方案是一個正常的選擇,但您可以使用流來完成。 它意味着NSInputStream ,這不是一件容易的事,因為你需要實現一堆方法。

基本上你的子類最初將返回頭字節,然后它會將“內部”流中的字節返回到文件內容,然后當它用完時它會返回頁腳字節。 這意味着要保留頁眉和頁腳有多大以及到目前為止處理了多少的記錄,但這不是一個大問題。

有創建一個子類的實例在這里這表明你需要實現以獲得流子類沒有拋出異常正常工作棘手的隱藏方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM