小文件下载
-
如果文件比较小,下载方式会比较多
- 直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url;
- 利用NSURLConnection发送一个HTTP请求去下载
- 如果是下载图片,还可以利用SDWebImage框架
-
如果是大文件下载,建议使用NSURLSession或者第三方框架
具体代码操作如下:
-(void)download
{
// 下载文件
NSURL * fileURL = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_05.mp4"];
// 2. 创建请求对象
NSURLRequest * request = [NSURLRequest requestWithURL:fileURL];
// 3. 发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 4. 写数据到沙盒中
NSString * fileStr = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString * fullPath = [fileStr stringByAppendingPathComponent:@"123.mp4"];
NSLog(@"保存位置:%@",fullPath);
[data writeToFile:fullPath atomically:YES];
NSLog(@"完成");
}];
}
- 第二种方式小文件下载
-(void)download4
{
// 下载文件
NSURL * fileURL = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_05.mp4"];
// 2. 创建请求对象
NSURLRequest * request = [NSURLRequest requestWithURL:fileURL];
// 3. 发送请求
// [[NSURLConnection alloc] initWithRequest:request delegate:self];
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark - NSURLConnectionDelegate
// 1. 当接收到服务器响应的时候调用
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%s",__func__);
// 得到文件的总大小(本次请求的文件数据的总大小)
self.totalSize = response.expectedContentLength;
}
// 2. 接收到服务器返回数据的时候调用,调用多次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// NSLog(@"%zd",data.length);
[self.fileData appendData:data];
// 进度 = 已经下载 / 文件总大小
NSLog(@"%f",1.0 * self.fileData.length / self.totalSize);
}
// 3. 当请求失败的时候会调用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// NSLog(@"%s",__func__);
NSLog(@"%@",error);
}
// 4. 请求结束的时候调用
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"%s",__func__);
// 4. 写数据到沙盒中
NSString * fileStr = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSString * fullPath = [fileStr stringByAppendingPathComponent:@"123.mp4"];
[self.fileData writeToFile:fullPath atomically:YES];
NSLog(@"保存位置:%@",fullPath);
}
文件上传的步骤
-
设置请求头
[request setValue:@"multipart/form-data; boundary=分割线" forHTTPHeaderField:@"Content-Type"]; -
设置请求体
-
非文件参数
- --分割线\r\n
- Content-Disposition: form-data; name="参数名"\r\n
- \r\n
- 参数值
- \r\n
-
文件参数
- --分割线\r\n
- Content-Disposition: form-data; name="参数名"; filename="文件名"\r\n
- Content-Type: 文件的MIMEType\r\n
- \r\n
- 文件数据
- \r\n
-
参数结束的标记
- --分割线--\r\n
-
具体代码如下:
-(void)upload
{
// 1. 确定请求路径
NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
// 2. 创建请求对象
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
// 3. 设置请求方法
request.HTTPMethod = @"POST";
// 4. 设置请求头信息
// Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryQPb2PB0tzJZMkCLa
[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
// 5. 拼接请求体数据
NSMutableData * filedata = [NSMutableData data];
// 5.1 文件参数
/*
--分隔符
Content-Disposition: form-data; name="file"; filename="静态05.jpg"
Content-Type: image/jpeg(MIMEType:大类型/小类型)
空行
文件参数
*/
NSData * oneData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:oneData];
// 把换行添加进请求体数据中
[filedata appendData:KNewLine];
// name:file 服务器规定的参数
// filename: 静态05.jpg 文件保存到服务器上面的名称
// Content-Type: 文件的类型
NSData * twoData = [@"Content-Disposition: form-data; name=\"file\"; filename=\"静态05.jpg\"" dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:twoData];
[filedata appendData:KNewLine];
NSData * thirdlyData = [@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:thirdlyData];
[filedata appendData:KNewLine];
[filedata appendData:KNewLine];
UIImage * image = [UIImage imageNamed:@"静态05"];
// UIImage --> NSData
NSData * imageData = UIImageJPEGRepresentation(image, 0.5);
[filedata appendData:imageData];
[filedata appendData:KNewLine];
// 5.2 非文件参数
/*
--分隔符
Content-Disposition: form-data; name="username"
空行
456123
*/
NSData * sixthData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:sixthData];
[filedata appendData:KNewLine];
NSData * seventhData = [@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:seventhData];
[filedata appendData:KNewLine];
[filedata appendData:KNewLine];
NSData * ninthData = [@"456123" dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:ninthData];
[filedata appendData:KNewLine];
// 5.3 结尾标识
NSData * tenthData = [[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
[filedata appendData:tenthData];
// 6. 设置请求体
request.HTTPBody = filedata;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 8. 解析数据
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
}
部分文件的MIMEType
类型 | 文件扩展名 | MIMEType |
---|---|---|
图 | png | image/png |
bmp\dib | image/ bmp | |
jpe\jpeg\jpg | image/jpeg | |
片 | gif | image/gif |
mp3 | audio/mpeg | |
多媒体 | mp4\mpg4\m4vmp4v | video/mp4 |
js | application/javascript | |
application/pdf | ||
文本 | text\txt | text/plain |
json | application/json | |
xml | text/xml |
获得文件的MIMEType
- 利用NSURLConnection
- (NSString *)MIMEType:(NSURL *)url
{
// 1.创建一个请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2.发送请求(返回响应)
NSURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
// 3.获得MIMEType
return response.MIMEType;
}
- 用C语言API
- (NSString *)mimeTypeForFileAtPath:(NSString *)path
{
if (![[[NSFileManager alloc] init] fileExistsAtPath:path]) {
return nil;
}
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
CFRelease(UTI);
if (!MIMEType) {
return @"application/octet-stream";
}
return (__bridge NSString *)(MIMEType);
}
压缩(使用第三方框架--ZipArchive )
下载地址:https://github.com/ZipArchive/ZipArchive
- 需要引入libz.dylib框架
- 导入头文件Main.h
- 创建压缩文件
+ (BOOL)createZipFileAtPath:(NSString *)path
withFilesAtPaths:(NSArray *)paths;
+ (BOOL)createZipFileAtPath:(NSString *)path
withContentsOfDirectory:(NSString *)directoryPath;
- 解压
+ (BOOL)unzipFileAtPath:(NSString *)path
toDestination:(NSString *)destination
网友评论