排入NSInputStream?

我想向NSInputStream添加三个“部分”:一个NSString,另一个流的输出,然后是另一个NSString。 这个想法如下:

第一个和最后一个NSString表示SOAP请求的开始和结束,而流的输出是加载一个非常大的文件并将其编码为Base64字符串的结果。 所以,最后我会让最终的NSInputStream像这样保存整个SOAP请求:

<soap开始> <Base64编码数据> <soap结束>

我希望整个请求在NSInputStream中保存的原因有两个:

  • 我不知道如何将非常大的数据文件加载到内存中
  • 我认为这是强制在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 ,这不是微不足道的,因为有一些你需要实现的方法。

    基本上你的子类最初会返回标题字节,然后它会从'内部'流中返回字节到文件内容,然后当它用完时返回页脚字节。 这意味着要记录页眉和页脚的大小以及到目前为止处理了多少,但这不是一个大问题。

    这里有一个创建子类的例子,它显示了你需要实现的棘手的隐藏方法,以使流子类正常工作而不会抛出异常。

    链接地址: http://www.djcxy.com/p/96713.html

    上一篇: Enqueueing into NSInputStream?

    下一篇: Buffering NSOutputStream used as NSInputStream?