php文件下载处理格局分析,断点下载

PHP完毕简单下载

PHP文件为download.php,供下载的文件为1.jpg.

<?php
    $filename="1.jpg";
    if(!file_exists($filename)){
        die("文件不存在");
    }                   //判断文件是否存在

    $fp =fopen($filename,"r");  //打开文件

    $file_size=filesize($filename);   //声明文件大小

    header("Content-type:application/octet-stream");
    header("Accept-Ranges:bytes");   //按字节大小返回
    header("Accept-Length:".$file_size);   //告诉浏览器文件大小
    header("Content-Disposition: attachment; filename=".$filename);  //下载框中文件的名字

    $buffer=1024;

    while(!feof($fp)){
        $data=fread($fp,$buffer);
    }            //判断文件是否下载完

    fclose($fp);    //关闭文件
?>

访问验证一下:
澳门葡京备用网址 1
澳门葡京备用网址 2

正文先发于自己的村办博客:『不羁阁』
https://bujige.net
作品链接:https://bujige.net/blog/iOS-Resume-Download-NSURLConnection.html

目录

  1. 文本下载简介
    1.1 文件下载分类
    1.1.1 按文件大小划分
    1.1.2 按完毕形式划分
  2. php文件下载处理格局分析,断点下载。文件下载已毕教学
    2.1 NSData(适用于小文件下载)
    2.2 NSURLConnection
    2.2.1 NSURLConnection(小文件下载)
    2.2.2 NSURLConnection(大文件下载)
    2.2.3 NSURLConnection(断点下载 | 帮忙离线)

正文实例讲述了php文件下载的拍卖方法。分享给大家供咱们参考。具体分析如下:

iOS 文件下载,ios文件下载

iOS 视频音乐类等使用会用到“文件下载”。文件下载在iOS中的完毕如下:

有关『文件下载、断点下载』所有已毕的Demo地址:Demo地址

php可以处理多种规则的文本下载,先来看上面示例:

1、小文件下载

@interface ViewController () <NSURLConnectionDataDelegate>

@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 文件数据 */
@property (nonatomic, strong) NSMutableData *fileData;
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger contentLength;
@end

 

- (void)viewDidLoad {
    [super viewDidLoad];
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"];
    [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];
}

#pragma mark - <NSURLConnectionDataDelegate>
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{
    self.contentLength = [response.allHeaderFields[@"Content-Length"] integerValue];
    self.fileData = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.fileData appendData:data];
    CGFloat progress = 1.0 * self.fileData.length / self.contentLength;
    NSLog(@"已下载:%.2f%%", (progress) * 100);
    self.progressView.progress = progress;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"下载完毕");

    // 将文件写入沙盒中

    // 缓存文件夹
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    // 文件路径
    NSString *file = [caches stringByAppendingPathComponent:@"minion_15.mp4"];

    // 写入数据
    [self.fileData writeToFile:file atomically:YES];
    self.fileData = nil;
}

 

iOS网络–『文件下载、断点下载』的落到实处相关文章:

<?php
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=testname.jpg"); 
readfile("images/test.jpg");
?>

2、大文件下载

#define XMGFile [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"minion_15.mp4"]

@interface ViewController () <NSURLConnectionDataDelegate>
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger contentLength;
/** 当前下载的总长度 */
@property (nonatomic, assign) NSInteger currentLength;

/** 文件句柄对象 */
@property (nonatomic, strong) NSFileHandle *handle;

@end

 

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"];
    [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];
}

 

#pragma mark - <NSURLConnectionDataDelegate>
/**
 * 接收到响应的时候:创建一个空的文件
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response
{
    // 获得文件的总长度
    self.contentLength = [response.allHeaderFields[@"Content-Length"] integerValue];

    // 创建一个空的文件
    [[NSFileManager defaultManager] createFileAtPath:XMGFile contents:nil attributes:nil];

    // 创建文件句柄
    self.handle = [NSFileHandle fileHandleForWritingAtPath:XMGFile];
}

/**
 * 接收到具体数据:马上把数据写入一开始创建好的文件
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    // 指定数据的写入位置 -- 文件内容的最后面
    [self.handle seekToEndOfFile];

    // 写入数据
    [self.handle writeData:data];

    // 拼接总长度
    self.currentLength += data.length;

    // 进度
    self.progressView.progress = 1.0 * self.currentLength / self.contentLength;
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 关闭handle
    [self.handle closeFile];
    self.handle = nil;

    // 清空长度
    self.currentLength = 0;
}

 

文件下载,ios文件下载 iOS
视频音乐类等使用会用到文件下载。文件下载在iOS中的已毕如下:
1、小文件下载 @interface ViewController () NSUR…

  • iOS网络–『文件下载、断点下载』的落实(一):NSURLConnection
  • iOS网络–『文件下载、断点下载』的落到实处(二):NSURLSession
  • iOS网络–『文件下载、断点下载』的贯彻(三):AFNetworking

分析上述代码:

1. 文件下载简介

在iOS开发进度中,大家平时会遭受文件下载的要求,比如说图片下载、音乐下载、视频下载,还有其他文件资源下载等等。

下边大家就把公文下载相关办法和知识点统计一下。

第一行代码是挟持下载;
其次行代码是给下载的内容指定一个名字;
其三行代码是把下载的情节读进文件中。
 
一贯以为要在一个页面中还要下载八个公文是不可能的,因为php第三回header发送下载新闻之后就无法再发送了。
明日算是知道了一种缓解方案,使用iframe来完成。 

1.1 文件下载分类

<iframe src="1.zip" style="border-style:none;width:0;height:0;">
</iframe>
<iframe src="2.zip" style="border-style:none;width:0;height:0;">
</iframe>

1.1.1 按文件大小划分

依据支付中实际上须要,如果按下载的文件大小来分类的话,可以分为:小文件下载、大文件下载。

因为小文件下载基本不要求拭目以待,可以利用再次来到整个文件的下载格局来进展文件下载,比如说图片。但是大文件下载要求考虑很多情况来改良用户体验,比如说:下载进程的来得、暂停下载以及断点续传、离线断点续传,还有下载时占用手机内存情状等等。

也足以用js生成iframe

1.1.2 按已毕格局划分

假定按照支付中应用到的下载格局的话,大家可以利用NSData、NSURLConnection(iOS9.0随后放任)、NSURLSession(推荐),以及选择第三方框架AFNetworking等艺术下载文件。

上边我们就按照文件大小,以及对应的兑现格局来讲学下『文件下载、断点下载』的现实性已毕。本文首要讲解NSData和NSURLConnection。

瞩望本文所述对大家的php程序设计有所接济。

2. 文件下载达成教学

您或许感兴趣的小说:

  • Flash三个上传示例ASP和PHP(原文件下载,包含后台程序)
  • PHP文件下载类
  • php利用header函数完结公文下载时一贯提示保存
  • PHP通过header完毕公文文件下载的代码
  • Php中文件下载作用落成超详细流程分析
  • PHP连接SQLSERVER
    注意事项(附dll文件下载)
  • 解决PHP超大文件下载,断点续传下载的点子详解
  • php已毕文件下载不难示例(代码完结文件下载)
  • php已毕公文下载作用的多少个代码分享
  • php完毕公文下载实例分享
  • php落成公文下载代码分享
  • php落成的帮忙断点续传的文本下载类
  • PHP完结文件下载断点续传详解
  • PHP落成文件下载详解
  • php完毕容易文件下载的法子
  • php控制文件下载速度的点子
  • PHP+Mysql+jQuery文件下载次数计算实例讲解
  • php限制文件下载速度的代码

2.1 NSData(适用于小文件下载)

NSData小文件下载效果.gif

  • 我们可以行使NSData的
    + (id)dataWithContentsOfURL:(NSURL *)url;拓展小文件的下载
  • 那些法子其实是发送四回GET请求,然后再次回到整个文件。
  • 留神:要求将下边的代码放到子线程中。

切实落到实处代码如下:

// 创建下载路径
NSURL *url = [NSURL URLWithString:@"http://pics.sc.chinaz.com/files/pic/pic9/201508/apic14052.jpg"];

// 使用NSData的dataWithContentsOfURL:方法下载
NSData *data = [NSData dataWithContentsOfURL:url];

// 如果下载的是将要显示的图片,则可以显示出来
// 如果下载的是其他文件,然后可以将data转存为本地文件

2.2 NSURLConnection

2.2.1 NSURLConnection(小文件下载)

NSURLConnection小文件下载效果.gif

大家得以经过NSURLConnection发送异步GET请求来下载文件。

// 创建下载路径
NSURL *url = [NSURL URLWithString:@"http://pics.sc.chinaz.com/files/pic/pic9/201508/apic14052.jpg"];

// 使用NSURLConnection发送异步GET请求,该方法在iOS9.0之后就废除了(推荐使用NSURLSession)
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:url] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    NSLog(@"%@",data);

    // 可以在这里把下载的文件保存起来
}];

2.2.2 NSURLConnection(大文件下载)

NSURLConnection大文件下载效果.gif

对于大文件的下载,大家就不可以动用上面的章程来下载了。因为你如若是几百兆以上的大文件,那么上面的艺术再次来到的data就会间接在内存里,这样内存必然会爆掉,所以用上面的情势不对路。那么我们可以运用NSURLConnection的另一个措施+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate通过发送异步请求,并贯彻相关代理方法来已毕大文件的下载。

// 创建下载路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_15.mp4"];
// 使用NSURLConnection发送异步GET请求,并实现相应的代理方法,该方法iOS9.0之后废除了(推荐使用NSURLSession)。
[NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];

此间运用到了代理,所以大家要促成NSURLConnectionDataDelegate的连锁方法。首要利用以下多少个艺术。

/**
 * 接收到响应的时候就会调用
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

/**
 * 接收到具体数据的时候会调用,会频繁调用
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

/**
 * 下载完文件之后调用
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;

/** 
 *  请求失败时调用(请求超时、网络异常) 
 */ 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

其中,didReceiveData方法会在承受到现实多少的时候被反复调用,而且每一回都传过来一部分data。

于是,我们得以创立一个大局NSMutableData来拼接每部分数据,最终将拼接完整的Data保存为文件。

而是那样的话,NSMutableData会随着拼接的数量而逐渐变得进一步大,那样会促成内存爆掉。这样做肯定不合乎。

那就是说大家相应怎么办呢?

大家应当在每得到一有的数据的时候,就将那有些数量写入沙盒中保存起来,并把这有的数量释放掉。

所幸大家有NSFilehandle(文件句柄)类,可以完毕对文本的读取、写入、更新。

大家须要做如下几步:

  1. 在经受到响应的时候,即在didReceiveResponse中开创一个空的沙盒文件,并且创办一个NSFilehandle类。

  2. 在接受到实际多少的时候,即在didReceiveData中向沙盒文件中写入数据。

    • 通过NSFilehandle的- (void)seekToFileOffset:(unsigned long long)offset;办法,制定文件的写入地方。或者通过NSFilehandle的- (unsigned long long)seekToEndOfFile;艺术,直接制定文件的写入地点为文件末尾。
    • 下一场经过NSFilehandle的writeData主意,我们得以想沙盒中的文件不断写入新数据。
  3. 在下载完结将来,关闭沙盒文件。

实际落到实处进程如下:

  • 概念下载文件须要动用的类和要落到实处的代理

@interface ViewController () <NSURLConnectionDataDelegate>

/** 下载进度条 */
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 下载进度条Label */
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;

/** NSURLConnection下载大文件需用到的属性 **********/
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger fileLength;
/** 当前下载长度 */
@property (nonatomic, assign) NSInteger currentLength;
/** 文件句柄对象 */
@property (nonatomic, strong) NSFileHandle *fileHandle;

@end
  • 接下来利用NSURLConnection的代理方式下载大文件

// 创建下载路径
NSURL *url = [NSURL URLWithString:@"http://bmob-cdn-8782.b0.upaiyun.com/2017/01/17/24b0b37f40d8722480a23559298529f4.mp3"];

// 使用NSURLConnection发送异步Get请求,并实现相应的代理方法,该方法iOS9.0之后废除了。
[NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url] delegate:self];
  • 末段完毕相关的NSURLConnectionDataDelegate方法

#pragma mark - <NSURLConnectionDataDelegate> 实现方法

/**
 * 接收到响应的时候:创建一个空的沙盒文件和文件句柄
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 获得下载文件的总长度
    self.fileLength = response.expectedContentLength;

    // 沙盒文件路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

    // 打印下载的沙盒路径
    NSLog(@"File downloaded to: %@",path);

    // 创建一个空的文件到沙盒中
    [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil];

    // 创建文件句柄
    self.fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
}

/**
 * 接收到具体数据:把数据写入沙盒文件中
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 指定数据的写入位置 -- 文件内容的最后面
    [self.fileHandle seekToEndOfFile];

    // 向沙盒写入数据
    [self.fileHandle writeData:data];

    // 拼接文件总长度
    self.currentLength += data.length;

    // 下载进度
    self.progressView.progress =  1.0 * self.currentLength / self.fileLength;
    self.progressLabel.text = [NSString stringWithFormat:@"当前下载进度:%.2f%%",100.0 * self.currentLength / self.fileLength];
}

/**
 *  下载完文件之后调用:关闭文件、清空长度
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 关闭fileHandle
    [self.fileHandle closeFile];
    self.fileHandle = nil;

    // 清空长度
    self.currentLength = 0;
    self.fileLength = 0;
}

2.2.3 NSURLConnection(断点下载 | 援救离线)

NSURLConnection离线断点下载效果.gif

NSURLConnection并不曾提供暂停下载的点子,只提供了收回下载职分的cancel方法。

那么,假诺我们想要使用NSURLConnection来促成断点下载的成效,就要求先通晓HTTP请求头中Range的知识点。

HTTP请求头中的Range可以只请求实体的一局地,指定范围。

Range请求头的格式为: Range: bytes=start-end

例如:
Range: bytes=10-:表示第10个字节及最终个字节的数据。
Range: bytes=40-100:表示第40个字节到第100个字节之间的数码。

注意:这里的[start,end],即是包含请求头的start及end字节的。所以,下一个请求,应该是上一个呼吁的[end+1,
nextEnd]。

故而大家必要做的手续为:

  1. 添加须要贯彻断点下载的[开始/暂停]按钮。
  2. 设置一个NSURLConnection的全局变量。
  3. 一旦持续下载,设置HTTP请求头的Range为当前已下载文件的长度地点到结尾文件末尾地点。然后创建一个NSURLConnection发送异步下载,并监听代理方法。
  4. 若是暂停下载,那么NSURLConnection发送打消下载情势,并清空。

具体落实进度如下:

  • 概念下载文件要求拔取的类和要贯彻的代理

@interface ViewController () <NSURLConnectionDataDelegate>

/** 下载进度条 */
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/** 下载进度条Label */
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;

/** NSURLConnection实现断点下载(支持离线)需要用到的属性 **********/
/** 文件的总长度 */
@property (nonatomic, assign) NSInteger fileLength;
/** 当前下载长度 */
@property (nonatomic, assign) NSInteger currentLength;
/** 文件句柄对象 */
@property (nonatomic, strong) NSFileHandle *fileHandle;

/* connection */
@property (nonatomic, strong) NSURLConnection *connection;

@end
  • 添加支持断点下载的[发端下载/暂停下载]按钮,并贯彻相应功用的代码

/**
 * 点击按钮 -- 使用NSURLConnection断点下载(支持离线)
 */
- (IBAction)resumeDownloadBtnClicked:(UIButton *)sender {
    // 按钮状态取反
    sender.selected = !sender.isSelected;

    if (sender.selected) {  // [开始下载/继续下载]
        // 沙盒文件路径
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"QQ_V5.4.0.dmg"];

        // fileLengthForPath: 方法用来判断已下载文件大小
        NSInteger currentLength = [self fileLengthForPath:path];
        if (currentLength > 0) {  // [继续下载]
            self.currentLength = currentLength;
        }
        // 1. 创建下载URL
        NSURL *url = [NSURL URLWithString:@"http://dldir1.qq.com/qqfile/QQforMac/QQ_V5.4.0.dmg"];

        // 2. 创建request请求
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        // 3. 设置HTTP请求头中的Range
        NSString *range = [NSString stringWithFormat:@"bytes=%ld-", self.currentLength];
        [request setValue:range forHTTPHeaderField:@"Range"];

        // 4.下载
        self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    } else {    // [暂停下载]
        [self.connection cancel];
        self.connection = nil;
    }
}

/** 
 * 获取已下载的文件大小
 */
- (NSInteger)fileLengthForPath:(NSString *)path {
    NSInteger fileLength = 0;
    NSFileManager *fileManager = [[NSFileManager alloc] init]; // default is not thread safe
    if ([fileManager fileExistsAtPath:path]) {
        NSError *error = nil;
        NSDictionary *fileDict = [fileManager attributesOfItemAtPath:path error:&error];
        if (!error && fileDict) {
            fileLength = [fileDict fileSize];
        }
    }
    return fileLength;
}
  • 澳门葡京备用网址 ,最后完毕相关的NSURLConnectionDataDelegate方法,那里和下面使用NSURLConnection完毕大文件下载的代码一致。

#pragma mark <NSURLConnectionDataDelegate> 实现方法

/**
 * 接收到响应的时候:创建一个空的沙盒文件
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

    // 获得下载文件的总长度:请求下载的文件长度 + 当前已经下载的文件长度
    self.fileLength = response.expectedContentLength + self.currentLength;

    // 沙盒文件路径
    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"QQ_V5.4.0.dmg"];

    NSLog(@"File downloaded to: %@",path);

    // 创建一个空的文件到沙盒中
    NSFileManager *manager = [NSFileManager defaultManager];

    if (![manager fileExistsAtPath:path]) {
        // 如果没有下载文件的话,就创建一个文件。如果有下载文件的话,则不用重新创建(不然会覆盖掉之前的文件)
        [manager createFileAtPath:path contents:nil attributes:nil];
    }

    // 创建文件句柄
    self.fileHandle = [NSFileHandle fileHandleForWritingAtPath:path];

}

/**
 * 接收到具体数据:把数据写入沙盒文件中
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 指定数据的写入位置 -- 文件内容的最后面
    [self.fileHandle seekToEndOfFile];

    // 向沙盒写入数据
    [self.fileHandle writeData:data];

    // 拼接文件总长度
    self.currentLength += data.length;

    // 下载进度
    self.progressView.progress =  1.0 * self.currentLength / self.fileLength;
    self.progressLabel.text = [NSString stringWithFormat:@"当前下载进度:%.2f%%",100.0 * self.currentLength / self.fileLength];
}

/**
 *  下载完文件之后调用:关闭文件、清空长度
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 关闭fileHandle
    [self.fileHandle closeFile];
    self.fileHandle = nil;

    // 清空长度
    self.currentLength = 0;
    self.fileLength = 0;
}

那样就使用NSURLConnection完结了『断点下载』的须要,并且协理程序被杀死,重新启航之后也能随着下载的急需。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website