我正在使用以下代码从网址下载epub / pdf。我喜欢提供进度条,所以当我开始下载时会显示进度,下载完成后会弹出一条消息。我该如何实现呢?
我的下载文件代码
-(void)Download
{
NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.feedbooks.com/book/3471.epub"]];
//Store the Data locally as epub File if u want pdf change the file extension
NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];
NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"3471.epub"];
[pdfData writeToFile:filePath atomically:YES];
NSLog(@"%@",filePath);
}
我在我的.m文件中使用此代码,但它不适用于我
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
_totalFileSize = response.expectedContentLength;
responseData = [[NSMutableData alloc] init];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
_receivedDataBytes += [data length];
MyProgressBar.progress = _receivedDataBytes / (float)_totalFileSize;
[responseData appendData:data];
}
答案 0 :(得分:2)
使用NSURLConnection
.h文件中的
double datalength;
NSMutableData *databuffer;
UIProgressView *progress;
.m文件中的
-(void)Download
{
NSURLConnection *con=[[NSURLConnection alloc]initWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.feedbooks.com/book/3471.epub"]] delegate:self startImmediately:YES];
[con start];
}
委托方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
datalength = [response expectedContentLength];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[databuffer appendData:data];
progress.progress = (databuffer.length/datalength);
self.HUD.detailsLabelText = [NSString stringWithFormat:@"Downloading %.f %%",(databuffer.length/datalength)*100];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *resourceDocPath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents"]];
NSString *filePath = [resourceDocPath stringByAppendingPathComponent:@"3471.epub"];
[pdfData writeToFile:filePath atomically:YES];
NSLog(@"%@",filePath);
}
答案 1 :(得分:0)
如果你curl -vvv -o epub.pdf http://www.feedbooks.com/book/3471.epub
,你会看到以下一行:
Content-Length: 603244
内容长度标头是您正在下载的数据的大小(以字节为单位)。您可以使用它来跟踪编写数据时的进度。
使用您当前的代码,您无法真正做到您想要的。您应该查看this answer以获取更多信息。
答案 2 :(得分:0)
您可以检查data
长度的NSData。然后你会找到实际下载的数据。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
{
// append the new data to the receivedData
[receivedData appendData:data];
}
在这里,您将获得以字节为单位的数据长度。您可以根据需要进行转换。
它可能对你有帮助。