获取大小文件NSURLConnection?

时间:2013-08-22 17:24:29

标签: ios objective-c download nsurlconnection

我需要在下载前获取文件大小。并使用进度条

这是我的代码运行良好,除非文件托管在Hostmonster服务器上我想知道错误是什么。

错误如下: [NSConcreteMutableData initWithCapacity:]:荒谬容量:4294967295,最大大小:2147483648字节'

这是我的代码

NSURL *url33;
NSNumber *filesize;
NSMutableData *data2;

url33 = [NSURL URLWithString: @ "http://www.nordenmovil.com/enconstruccion.jpg"];

- (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURLResponse*) response
{
   filesize = [NSNumber numberWithUnsignedInteger:[response expectedContentLength]];
    NSLog(@"%@",filesize);
}


- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)recievedData {
    [data2 appendData:recievedData];

    if (data2==nil) {
        data2 = [[NSMutableData alloc] initWithCapacity:[filesize floatValue]];
    }

    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[data2 length]]; //MAGIC
    float progress = [resourceLength floatValue] / [filesize floatValue];
    progressBar.progress = progress;
}

1 个答案:

答案 0 :(得分:4)

expectedContentLength不是无符号值。它的类型为long long,已签名。

无符号4294967295等于有符号-1。 -1表示NSURLResponseUnknownLength。如果返回此值,则响应没有有效的内容大小,http响应并不总是包含内容大小。

分配NSData对象时检查NSURLResponseUnknownLength

if ([response expectedContentLength] == NSURLResponseUnknownLength) {
    // unknown content size
    fileSize = @0;
}
else {
    fileSize = [NSNumber numberWithLongLong:[response expectedContentLength]];
}

当然,如果您不知道内容大小,则无法显示进度条。在这种情况下,您应该显示不同的进度指示器。在尝试除以零之前检查0; - )


这段代码也错了:

[data2 appendData:recievedData];

if (data2==nil) {
    data2 = [[NSMutableData alloc] initWithCapacity:[filesize floatValue]];
}

首先将数据附加到data2,然后检查data2是否为nil。如果它是零你只是丢掉了receivedData。你应该先检查一下nil。或者只是在connection:didReceiveResponse:

中创建NSMutableData对象