原生NSURLSession手寫請求體上傳圖片的實現(xiàn)(測試學(xué)習(xí))

上傳圖片在網(wǎng)頁中最常用的就是POST請求救军,將圖片編碼到POST請求體中(body)陆爽,通過請求數(shù)據(jù)一起發(fā)送到服務(wù)器上鞠抑;
請求體寫法——

格式如下

--Boundary+72D4CD655314C423 // 分割符伊诵,以“--”開頭丈冬,后面的字符串為標(biāo)識符,不可為中文币厕,與結(jié)尾對應(yīng)

Content-Disposition: form-data; name="file"; filename="1.png" // 這里注明服務(wù)器接收圖片的參數(shù)及服務(wù)器上保存圖片的文件名

Content-Type:image/png // 圖片類型為png

Content-Transfer-Encoding: binary // 編碼方式

// 這里是空一行列另,必不可少!旦装!

//... contents of boris.png ... // 圖片數(shù)據(jù)部分

--Boundary+72D4CD655314C423-- // 分隔符后面以"--"結(jié)尾页衙,表明結(jié)束

#pragma mark - 原生方法對參數(shù)字典的處理

- (NSMutableData *)dataWithParamsDictionary:(NSDictionary *)params Boundary:(NSString *)boundary {

    NSMutableData *body = [NSMutableData data];

    [params enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

        NSMutableString *fieldString = [NSMutableString string];

        [fieldString appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];

        [fieldString appendString:[NSString stringWithFormat:@"Content-Disposition: form-data;name=\"%@\"\r\n\r\n", key]];

        [fieldString appendString:[NSString stringWithFormat:@"%@", obj]];

        [body appendData:[fieldString dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    }];

    return body;

}

#pragma mark - 原生方法對圖片數(shù)據(jù)的處理

- (NSMutableData *)dataWithImgArray:(NSArray<UIImageView *> *)imgArray Boundary:(NSString *)boundary {

    NSMutableData *totalImgData = [NSMutableData data];

    for (int index = 0; index < imgArray.count; index++) {

        NSMutableString *topStr = [NSMutableString string];

        UIImageView *imageView = [imgArray objectAtIndex:index];

        UIImage *img = imageView.image;

        NSData *originImgData = UIImageJPEGRepresentation(img, 1);

        NSData *imgData;

        if (originImgData.length / 1024.0f / 1024.0f > 4.5) {

            imgData = [self imageWithImage:img scaledToSize:CGSizeMake(img.size.width * 0.5, img.size.height * 0.5)];

        }else {

            imgData = UIImageJPEGRepresentation(img, 0.15);

        }

        [topStr appendString:[NSString stringWithFormat:@"--%@\r\n", boundary]];

        [topStr appendString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"upload\"; filename=\"%d.jpg\"\r\n", index]];

        [topStr appendString:@"Content-Type:image/jpeg\r\n"];

        [topStr appendString:@"Content-Transfer-Encoding: binary\r\n\r\n"];

        [totalImgData appendData:[topStr dataUsingEncoding:NSUTF8StringEncoding]];

        [totalImgData appendData:imgData];

        [totalImgData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    }

    return totalImgData;

}

#pragma mark - **************這里是用原生方法寫的upload方法,重點在拼接部分

- (void)upload {
    NSString *boundary = [NSString stringWithFormat:@"Boundary+%08X%08X", arc4random(), arc4random()];

    NSMutableData *paramsData = [self dataWithParamsDictionary:finalParamDic Boundary:boundary];

    NSMutableData *imgsData = [self dataWithImgArray:_arrayImgData Boundary:boundary];

    NSMutableData *finalData = [NSMutableData data];

    [finalData appendData:paramsData];

    [finalData appendData:imgsData];

    NSString *bottomStr = [NSString stringWithFormat:@"--%@--", boundary];

    [finalData appendData:[bottomStr dataUsingEncoding:NSUTF8StringEncoding]];

    NSMutableURLRequest *originalRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", SERVER_ADDRESSCATA, @"post/postAction!addPost"]] cachePolicy:0 timeoutInterval:160.0f];

    [originalRequest setHTTPMethod:@"POST"];

    [originalRequest setHTTPBody:finalData];

    [originalRequest setValue:[NSString stringWithFormat:@"%ld", (unsigned long)finalData.length] forHTTPHeaderField:@"Content-Length"];

    [originalRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];

    NSURLSessionDataTask *uploadTask = [self.sessionManager dataTaskWithRequest:originalRequest uploadProgress:^(NSProgress * _Nonnull uploadProgress) {

        NSLog(@"total == %lld", uploadProgress.totalUnitCount);

        NSLog(@"sent == %lld", [uploadProgress.completedUnitCount](http://uploadProgress.completedUnitCount));

    } downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        NSString *resString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

        resString = [resString stringByReplacingOccurrencesOfString:@"\n" withString:@""];

        NSData *resData = [resString dataUsingEncoding:NSUTF8StringEncoding];

        NSDictionary *resModel = [NSJSONSerialization JSONObjectWithData:resData options:NSJSONReadingMutableLeaves error:nil];

        [self dealWithResponse:httpResponse model:resModel error:error];

    }];

mark - ****************以上是用原生方法寫的upload方法阴绢,重點在拼接部分

    NSURLSessionUploadTask *originalTask = [self.sessionManager uploadTaskWithRequest:originalRequest fromData:finalData progress:^(NSProgress * _Nonnull uploadProgress) {

    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

        NSString *resString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

        resString = [resString stringByReplacingOccurrencesOfString:@"\n" withString:@""];

        NSData *resData = [resString dataUsingEncoding:NSUTF8StringEncoding];

        NSDictionary *resModel = [NSJSONSerialization JSONObjectWithData:resData options:NSJSONReadingMutableLeaves error:nil];

        [self dealWithResponse:httpResponse model:resModel error:error];

    }];

    [uploadTask resume];
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末店乐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呻袭,更是在濱河造成了極大的恐慌眨八,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左电,死亡現(xiàn)場離奇詭異廉侧,居然都是意外死亡,警方通過查閱死者的電腦和手機篓足,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門段誊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栈拖,你說我怎么就攤上這事连舍。” “怎么了涩哟?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵索赏,是天一觀的道長。 經(jīng)常有香客問我贴彼,道長参滴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任锻弓,我火速辦了婚禮砾赔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘青灼。我一直安慰自己暴心,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布杂拨。 她就那樣靜靜地躺著专普,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弹沽。 梳的紋絲不亂的頭發(fā)上檀夹,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天筋粗,我揣著相機與錄音,去河邊找鬼炸渡。 笑死娜亿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚌堵。 我是一名探鬼主播买决,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吼畏!你這毒婦竟也來了督赤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泻蚊,失蹤者是張志新(化名)和其女友劉穎躲舌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體性雄,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡没卸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了毅贮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片办悟。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡尘奏,死狀恐怖滩褥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炫加,我是刑警寧澤瑰煎,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站俗孝,受9級特大地震影響酒甸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赋铝,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一插勤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧革骨,春花似錦农尖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筑凫,卻和暖如春滑沧,著一層夾襖步出監(jiān)牢的瞬間并村,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工滓技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哩牍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓殖属,卻偏偏與公主長得像姐叁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洗显,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 長假第二天外潜,老公難得騰出一天時間,出遠門是不現(xiàn)實的挠唆,只能在附近的景點中考慮处窥,最后我們選擇了離家三十多公里的夜郎洞。...
    米蘇聞閱讀 1,074評論 1 5
  • 今天玄组,我終于看完了《武則天》滔驾。 武則天,是我特別崇拜的一個女人俄讹。原因很簡單:她是中國歷史上唯一一個女皇帝哆致。也...
    非言飛語閱讀 738評論 1 4
  • 每當(dāng)他們的關(guān)系降至冰點,她都會在被窩里捧著手機一頁頁翻看曾經(jīng)親近時的短信記錄患膛。來來回回摊阀,哪怕只是一行省略號,都被她...
    風(fēng)雨等故人閱讀 174評論 0 0
  • 問題: RecyclerView 調(diào)用notifyItemChanged()方法更新單個Item時踪蹬,此Item有閃...
    AndroidPool閱讀 7,422評論 3 3