Ios 排队进入NSInputStream?
我想向NSInputStream添加三个“部分”:一个NSString、另一个流的输出,然后是另一个NSString。其思路如下: 第一个和最后一个NSString表示SOAP请求的开始和结束,而流的输出是加载非常大的文件并将其编码为Base64字符串的结果。因此,最终我会让最终的NSInputStream保存整个SOAP请求,如下所示:Ios 排队进入NSInputStream?,ios,nsstream,nsinputstream,Ios,Nsstream,Nsinputstream,我想向NSInputStream添加三个“部分”:一个NSString、另一个流的输出,然后是另一个NSString。其思路如下: 第一个和最后一个NSString表示SOAP请求的开始和结束,而流的输出是加载非常大的文件并将其编码为Base64字符串的结果。因此,最终我会让最终的NSInputStream保存整个SOAP请求,如下所示: 我希望将整个请求保存在NSInputStream中的原因有两个: 我不知道如何将非常大的数据文件加载到内存中 我认为这是强制以HTTP1.1块发送最终请求的
NSInputStream *dataStream = ....;
[request setHTTPBodyStream:dataStream];
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());
这确保了文件内容的HTTP 1.1分块传输。连接完成后,删除临时文件
这似乎很好,但当然这是一个恼人的工作。我不想在一个临时文件中写东西,因为它本来可以由streams处理(理想情况下)。如果有人还有更好的建议,请告诉我:)
更新3
好的,另一个更新正在进行中。虽然我对文件的写入似乎有效,但我现在遇到了一个意外问题,一些请求未能上传到服务器。具体来说,一切都按照计划进行,我将临时文件的内容读取到一个流中,并将我请求的HTTP正文设置为该流,然后它开始传输我希望的HTTP 1.1数据块-但由于某些原因,一些数据包被丢弃,最后的请求-这是我的猜测-格式错误,因此失败。我认为丢弃数据包的问题是随机的,因为我在较大的请求上观察到它——也就是说,这个问题有更多的机会出现——而我较小的请求通常会顺利通过。这当然是一个独立的问题,从原来的问题。如果有人知道是什么原因导致了这种情况,我在这里询问了这个问题:您的解决方案是一个不错的选择,但您可以使用流来解决。它意味着子类化
NSInputStream
,这并不简单,因为需要实现一系列方法
基本上,您的子类将首先返回页眉字节,然后它将从“内部”流返回字节到文件内容,然后在用完时返回页脚字节。这意味着维护一个记录,记录页眉和页脚有多大以及到目前为止已经处理了多少,但这不是一个大问题
这里有一个创建子类的示例,它展示了在不引发异常的情况下让流子类正常工作所需实现的复杂隐藏方法
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url];
...
NSInputStream *dataStream = [NSInputStream inputStreamWithFileAtPath:_tempFilePath];
[request setHTTPBodyStream:dataStream];