iOS :使用http上传文件到后台,并进行用户名和密码的验证

2020-05-21  本文已影响0人  你的代码掉了

最近突然要修改我们应用的App的文件上传方式,以前没接触过这方面的内容,所以特此记录一下.

正文开始:
第一步:创建NSMutableURLRequest

    //1. 创建请求路径
    NSURL *url = [NSURL URLWithString:urlString];
    //2. 创建可变请求对象
    NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url];
    //2.1 设置请求方法
    requestM.HTTPMethod = @"POST";
    //2.2 设置请求头信息
    [requestM setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];

第二步:创建NSURLSession

- (NSURLSession *)session
{
    // 统一设置所有的 会话对象创建的任务(upload,upload2)的 配置
    if (!_session) {
        
        // 设置会话对象的配置
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        // 设置配置的一些内容
        //是否运行蜂窝访问
        config.allowsCellularAccess = YES;
        // 网络超时
        config.timeoutIntervalForRequest = 15;
        //创建会话对象
        _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    }
    return _session;
}

第三步:准备要上传的内容

Kboundary:(自定义的随机字符串)
KNewLine换行符

define Kboundary @"----WebKitFormBoundaryOhB08CzI96Eux6PO"

define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

 //5. 设置请求体数据
    NSMutableData *fileData = [NSMutableData data];
    //5.1 文件参数
    /*
     --分隔符
     Content-Disposition: form-data; name="file"; filename="love.jpg"
     Content-Type: image/jpeg
     空行
     文件参数
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    // 拼接换行
    [fileData appendData:KNewLine];
    
    //name:file 服务器规定的参数
    //filename:Snip20160225_341.png 文件保存到服务器上面的名称
    //Content-Type:文件的类型
    [fileData appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"cy.jpg\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    
//    UIImage *image = [UIImage imageNamed:@"ddddd"];
//    // UIImage --> NSData
//    NSData *imageData = UIImagePNGRepresentation(image);
    
    NSData *fData = [NSData dataWithContentsOfFile:filePath];

    
    
    [fileData appendData:fData];
    [fileData appendData:KNewLine];
    
    //5.2 非文件参数
    /*
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     cy
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    [fileData appendData:[@"cy" dataUsingEncoding:NSUTF8StringEncoding]];
    [fileData appendData:KNewLine];
    
    //5.3 结尾标识
    /*
     --分隔符--
     */
    [fileData appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
    

第四步:上传

    //4. 创建NSURLSessionUploadTask任务
    /*
     param1: 请求对象
     param2: 请求体数据
     */
    NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithRequest:requestM fromData:[self getBobyDataWithFilePath:filePaTHString FileName:fileName FileType:fileType ] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        // 解析数据
//        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }];
    //5. 执行task
    [uploadTask resume];

fromData=第三步创建出来的NSdata,
FileName= 你要上传的文件名称
FileType= 文件类型
self.session = 第二步创建session

第五步:验证身份
遵循 <NSURLSessionDelegate> 实现下面的 方法进行身份验证

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
    NSLog(@"NSURLSessionTaskDelegate:::询问>>服务器需要客户端配合验证--任务级别");
    NSURLCredential * cre =[NSURLCredential credentialWithUser:@"test1" password:@"aA123!" persistence:NSURLCredentialPersistenceNone];
    completionHandler(NSURLSessionAuthChallengeUseCredential,cre);
}

完成!!!
感谢老大的指导!

参考文章:
NSURLdelegate
使用http上传文件

上一篇下一篇

猜你喜欢

热点阅读