NSURLConnection文件上传&&解压缩

文件上传的步骤

  • 设置请求头
[request setValue:[NSString stringWithFormat:@"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

请求头请求体的样式

  • 请求头
    请求头
  • 请求体
    请求体

文件上传的代码实现

#define AHBoundary @"AHUAN" // 分割线
#define AHEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
#define AHNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 创建请求
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod = @"POST";

    // 设置请求头(告诉告诉服务器,这是一个文件上传的请求)
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", AHBoundary] forHTTPHeaderField:@"Content-Type"];

    // 设置请求体
    NSMutableData *body = [NSMutableData data];

    // 文件参数

    // 分割线
    [body appendData:AHEncode(@"--")];
    [body appendData:AHEncode(AHBoundary)];
    [body appendData:AHNewLine];

    // 文件参数名
    [body appendData:AHEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"placeholder.png\""])];
    [body appendData:AHNewLine];

    // 文件的类型
    [body appendData:AHEncode([NSString stringWithFormat:@"Content-Type: image/png"])];
    [body appendData:AHNewLine];

    // 文件数据
    [body appendData:AHNewLine];

    // UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>)
    UIImage *image = [UIImage imageNamed:@"placeholder"];
    [body appendData:UIImagePNGRepresentation(image)];
    // [body appendData:[NSData dataWithContentsOfFile:@"/Users/ahuan/Desktop/placeholder.png"]];

    [body appendData:AHNewLine];

    // 非文件参数
    // 分割线
    [body appendData:AHEncode(@"--")];
    [body appendData:AHEncode(AHBoundary)];
    [body appendData:AHNewLine];

    // 参数名
    [body appendData:AHEncode([NSString stringWithFormat:@"Content-Disposition: form-data; name=\"username\""])];
    [body appendData:AHNewLine];

    // 参数值
    [body appendData:AHNewLine];
    [body appendData:AHEncode(@"AHUAN")];
    [body appendData:AHNewLine];

    // 结束标记
    [body appendData:AHEncode(@"--")];
    [body appendData:AHEncode(AHBoundary)];
    [body appendData:AHEncode(@"--")];
    [body appendData:AHNewLine];

    request.HTTPBody = body;

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
        NSLog(@"%@", [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
    }];
}

@end

获取文件的Content-Type类型

两种方式实现

/**
 *  获取文件的Content-Type类型
 *  @param filePath 文件的路径
 */
- (NSString *)getMIMEType:(NSString *)filePath
{
    NSURLResponse *response = nil;
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]];
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    return response.MIMEType;
}
// 这种方式需要导入MobileCoreServices.framework框架
+ (NSString *)mimeTypeForFileAtPath:(NSString *)path
{
    if (![[NSFileManager defaultManager] 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;
}

第三方解压缩框架–SSZipArchive

  • CocoaPods的导入SSZipArchive
  • 创建压缩文件
[SSZipArchive createZipFileAtPath:<#(NSString *)#> withFilesAtPaths:<#(NSArray *)#>];
[SSZipArchive createZipFileAtPath:<#(NSString *)#> withContentsOfDirectory:<#(NSString *)#>];
  • 解压
    [SSZipArchive unzipFileAtPath:<#(NSString *)#> toDestination:<#(NSString *)#>];

CFStringRef 和 NSString之间的转化

CFStringRef str;
NSString *str2 = (__bridge NSString *)str;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AFNetworking是一个基于Objective-C语言的iOS网络请求框架,它提供了一系列方便的API,帮助开发者快速地进行网络请求并处理响应内容。其原理是基于NSURLConnectionNSURLSession建立的网络请求,通过对网络请求的封装,提供了比原生API更加便捷的操作方式。 常用操作包括: 1. 发起网络请求:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的GET、POST等方法,可以方便地发起网络请求。 2. 设置请求参数:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的setParameterEncoding方法或AFHTTPRequestSerializer类的setQueryStringSerializationWithStyle方法,可以设置请求参数的编码格式。 3. 设置请求头:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的setValue:forHTTPHeaderField方法,可以设置请求头信息。 4. 处理响应数据:使用AFHTTPRequestOperation类的completionBlock或AFHTTPSessionManager类的dataTaskWithRequest:completionHandler方法,可以处理请求响应数据。 5. 下载文件:使用AFHTTPRequestOperation类的setDownloadProgressBlock和setCompletionBlockWithSuccess方法或AFHTTPSessionManager类的downloadTaskWithRequest:progress:destination:completionHandler方法,可以实现文件下载功能。 6. 上传文件:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的POST方法和AFHTTPRequestSerializer类的multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock方法,可以实现文件上传功能。 总体来说,AFNetworking提供了丰富的API和良好的封装,使得iOS开发者能够更加方便地进行网络请求和处理响应数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值