IOS 断点续下,上传

了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发 

 IOS学习交流群 431449751;

 

在服务器支持的情况下才能实现该功能

断点续下功能,主要代码如下:

[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];  // 防止用缓冲器里面的数据

[request setValue:@"bytes=10000-"forHTTPHeaderField:@"Range"];  // 设置从哪个位置开始下载

Range头域可以请求实体的一个或者多个子范围。例如,
  表示头500个字节:bytes=0-499
  表示第二个500字节:bytes=500-999
  表示最后500个字节:bytes=-500
  表示500字节以后的范围:bytes=500-
  第一个和最后一个字节:bytes=0-0,-1
  同时指定几个范围:bytes=500-600,601-999
  但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。


服务器给客服端的相应的信息查看,如下代码

- (void)connection:(NSURLConnection *)theConnection didReceiveResponse:(NSURLResponse *)response

{

NSHTTPURLResponse * httpResponse;

httpResponse = (NSHTTPURLResponse *) response;

查看httpResponse的头 allHeaderFields 能看到相关信息, 可以判断你的断点续下是否请求成功

例如("Content-Range" = "bytes 10000-196041/196042";    "Content-Length" = 186042;是下载的内容大小)// 服务器返回的字段

}

文件的读写代码:///用文件流边读边写,控制内存

self.fileStream = [NSOutputStreamoutputStreamToFileAtPath:self.filePathappend:YES]; ( append: YES 在文件尾追加数据)

如果流用 [NSOutputStream outputStreamToMemory] 这个初始化,下载一个20M的文件,需要20M的内存;而NSOutputStreamoutputStreamToFileAtPath则不需要


读文件代码:

attrs = [fileManager attributesOfItemAtPath:originalFilePath error:NULL];

originalFileSize = [[attrs objectForKey:NSFileSize] unsignedLongLongValue];



断点续传功能,主要代码如下:

先用CFStreamCreateBoundPair创建俩Stream,(也可以用socketpair创建)一个inputStream,一个outputStream,把inputStream用来与服务端传输数据,outputStream从本地写入数据,outputStream代理,监控outputStream的stream变化,把数据写入outputStream中。 inputStream和outStream是全双通管道的关系

注意:inputStream和outputStream之间的关系

还有设置http的head为文件类型

  CFStreamCreateBoundPair(

            NULL

            ((inputStreamPtr  != nil) ? &readStream : NULL),

            ((outputStreamPtr != nil) ? &writeStream : NULL), 

            (CFIndex) bufferSize

        );

、、、、、、、、、、、、、、、

request = [NSMutableURLRequestrequestWithURL:url];

        [request setHTTPMethod:@"POST"];

        [request setHTTPBodyStream:self.inputStream];

        self.connection = [NSURLConnectionconnectionWithRequest:request delegate:self];

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode

{
。。。。。。

caseNSStreamEventHasSpaceAvailable:

先从文件流中读取数据,然后写到outputStream中,直到写,delegate结束

bytesWritten = [self.outputStreamwrite:bufC maxLength:testStr.length];

。。。。。。
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值