206 NSSessionDownloadTask上的内容范围响应

时间:2015-07-29 11:16:48

标签: ios nsurlsession

我正在使用NSSessionDownloadTask下载大型mp4。我已经多次使用过NSURLSessions并且没有任何问题,但这次有些事让我难过......

我这样开始请求:

ErrorDocument 404 /404-error.php
ErrorDocument 500 /404-error.php

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=302,L]

RewriteCond %{THE_REQUEST} ^(?:GET|HEAD)\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+?)/?$ $1.php [L]

首先打电话:

NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:url];
    self.sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.sessionConfig.timeoutIntervalForRequest = 60;
    self.urlSession = [NSURLSession sessionWithConfiguration:self.sessionConfig delegate:self delegateQueue:nil];
    self.downloadTask = [self.urlSession downloadTaskWithRequest:downloadRequest];
    [self.downloadTask resume];

我得到的响应标题是:

- (void) URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

然后立即致电:

{ status code: 206, headers {
"Accept-Ranges" = bytes;
"Cache-Control" = "max-age=604800";
Connection = "keep-alive";
"Content-Length" = 1001;
"Content-Range" = "bytes 0-1000/566368944";
"Content-Type" = "video/mp4";
Date = "Wed, 29 Jul 2015 11:10:41 GMT";
Etag = "\"21c21ab0-4f46826b4c580\"";
Expires = "Wed, 05 Aug 2015 11:10:41 GMT";
"Last-Modified" = "Wed, 12 Mar 2014 12:41:10 GMT";
Server = Apache;
}

..请求结束。!

我错过了什么?感谢

2 个答案:

答案 0 :(得分:3)

这不是缓存问题。您的服务器实现了Range标头。这将帮助您在上次请求中发送了多少数据。此请求将持续发送数据,直到达到content-Length这个文件的完整大小。您需要在请求中发送Range标头并相应地处理响应。

实施例

    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=71726";
    Connection = "keep-alive";
    "Content-Length" = 34538928;
    "Content-Type" = "text/plain";
    Date = "Mon, 04 Jan 2016 10:23:10 GMT";
    Etag = "\"2681502-20f05b0-51966ce4c0380\"";
    Expires = "Tue, 05 Jan 2016 06:18:36 GMT";
    "Last-Modified" = "Fri, 26 Jun 2015 07:37:02 GMT";
    Server = Apache;

我首先请求了视频网址,但是我收到了上面的标题。它开始下载几秒钟后我停止进程并重新启动应用程序我得到了以下标题信息

    "Accept-Ranges" = bytes;
    "Cache-Control" = "max-age=71726";
    Connection = "keep-alive";
    "Content-Length" = 34536357;
    "Content-Range" = "bytes 2571-34538927/34538928";
    "Content-Type" = "text/plain";
    Date = "Mon, 04 Jan 2016 10:23:58 GMT";
    Etag = "\"2681502-20f05b0-51966ce4c0380\"";
    Expires = "Tue, 05 Jan 2016 06:19:24 GMT";
    "Last-Modified" = "Fri, 26 Jun 2015 07:37:02 GMT";
    Server = Apache;

如果您观察到两个标题,您将在第二个标题中找到" Content-Range"这意味着您的文件已下载"字节2571"字节大小为34538927。然后它会发送另一个像" 23672"根据您的网络速度的字节数。

这"范围"和"内容范围"将帮助您以简历方式下载大文件。

实施例。假设在此网络连接丢失后您下载了90MB数据的100MB文件。然后你需要从开始下载文件。

在" Range"的帮助下避免这种情况。和"内容长度"您可以保存用户数据。

希望你能理解

答案 1 :(得分:0)

这似乎是一个缓存问题。

在此请求之前,我请求许可证并使用范围请求0-1000向mp4发出请求。所以当我请求相同的url(即使没有Range标头)时,它返回上一个响应。