1

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

这是我的代码运行良好,除非文件托管在 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;
}
4

1 回答 1

4

expectedContentLength不是无符号值。它的类型是long long, 是有符号的。

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

NSURLResponseUnknownLength在分配 NSData 对象时检查。

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。如果它是 nil 你只是扔掉了 receivedData。你应该先检查 nil 。或者只是创建 NSMutableData 对象connection:didReceiveResponse:

于 2013-08-22T18:02:10.040 回答