1. 程式人生 > >IOS 利用AFN上傳圖片,支援多張、單張上傳

IOS 利用AFN上傳圖片,支援多張、單張上傳

前言:本文主要利用AFN來進行圖片上傳,支援單張、多張;

個人覺得導致上傳失敗的原因,大部分情況下都是由於

[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"upload%d",i+1] fileName:fileName mimeType:@"image/jpeg"];
這個方法的引數沒有與後臺一致導致的。

其中需要跟後臺約定的有:

1、name:後臺可以通過檔名來獲取到相應的圖片流;

2、mimeType:更多的是讓後臺知道你上傳的型別;

說白了就是報文頭能夠讓後臺識別

NSMutableDictionary *mutableHeaders = [NSMutableDictionary dictionary];
    [mutableHeaders setValue:[NSString stringWithFormat:@"form-data; name=\"%@\"; filename=\"%@\"", name, fileName] forKey:@"Content-Disposition"];
    [mutableHeaders setValue:mimeType forKey:@"Content-Type"];


具體程式碼如下

#import <Foundation/Foundation.h>

typedef void(^HttpUploadSuccessBlock)(id Json);
typedef void(^HttpUploadFailureBlock)();

@interface HttpTool : NSObject

/**
 *  上傳圖片(單張)
 *
 *  @param path    路徑
 *  @param image   圖片
 *  @param params  引數
 *  @param success 成功回撥
 *  @param failure 失敗回撥
 */
+ (void)uploadImageWithPath:(NSString *)path image:(UIImage *)image params:(NSDictionary *)params success:(HttpUploadSuccessBlock)success failure:(HttpUploadFailureBlock)failure;

/**
 *  上傳圖片(多張)
 *
 *  @param path    路徑
 *  @param photos  圖片陣列
 *  @param params  引數
 *  @param success 成功回撥
 *  @param failure 失敗回撥
 */
+ (void)uploadImageWithPath:(NSString *)path photos:(NSArray *)photos params:(NSDictionary *)params success:(HttpUploadSuccessBlock)success failure:(HttpUploadFailureBlock)failure;

@end
#import "HttpTool.h"
#import "AFNetworking.h"
#import "SVProgressHUD.h"

static AFHTTPSessionManager *manager;

@implementation HttpTool

//為了防止記憶體洩露
+ (AFHTTPSessionManager *)sharedHttpSession
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer.timeoutInterval = 10;
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json", @"text/plain", @"text/html", nil];
    });
    return manager;
}

#pragma mark 上傳單張圖片
+ (void)uploadImageWithPath:(NSString *)path image:(UIImage *)image params:(NSDictionary *)params success:(HttpUploadSuccessBlock)success failure:(HttpUploadFailureBlock)failure
{
    NSArray *array = [NSArray arrayWithObject:image];
    [self uploadImageWithPath:path photos:array params:params success:success failure:failure];
}

#pragma mark 上傳圖片
+ (void)uploadImageWithPath:(NSString *)path photos:(NSArray *)photos params:(NSDictionary *)params success:(HttpUploadSuccessBlock)success failure:(HttpUploadFailureBlock)failure
{
    [SVProgressHUD showProgress:-1 status:@"正在上傳,請稍等."];
    path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    AFHTTPSessionManager *manager = [HttpTool sharedHttpSession];
    [manager POST:path parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (int i = 0; i < photos.count; i ++) {
            NSDateFormatter *formatter=[[NSDateFormatter alloc]init];
            
[email protected]
"yyyyMMddHHmmss"; NSString *str=[formatter stringFromDate:[NSDate date]]; NSString *fileName=[NSString stringWithFormat:@"%@.jpg",str]; UIImage *image = photos[i]; NSData *imageData = UIImageJPEGRepresentation(image, 0.28); [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"upload%d",i+1] fileName:fileName mimeType:@"image/jpeg"]; } } progress:^(NSProgress * _Nonnull uploadProgress) { MyLog(@"uploadProgress is %lld,總位元組 is %lld",uploadProgress.completedUnitCount,uploadProgress.totalUnitCount); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSString *resultCode = [NSString stringWithFormat:@"%@",[responseObject objectForKey:@"result_code"]]; NSString *resultInfo = [responseObject objectForKey:@"result_info"]; MyLog(@"resultInfo is %@",resultInfo); if ([resultCode isEqualToString:@"1"]) { [SVProgressHUD showSuccessWithStatus:@"上傳成功"]; if (success == nil) return ; success(responseObject); }else { [SVProgressHUD showErrorWithStatus:resultInfo]; if (failure == nil) return ; failure(); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { [SVProgressHUD showErrorWithStatus:@"上傳失敗"]; if (failure == nil) return ; failure(); }]; }


相關推薦

IOS 利用AFN圖片支援單張

前言:本文主要利用AFN來進行圖片上傳,支援單張、多張; 個人覺得導致上傳失敗的原因,大部分情況下都是由於 [formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"upload

ajaxFileUpload.js 無重新整理圖片支援個引數同時支援 ie6-ie10

ajaxFileUpload 無重新整理上傳的原理: 在頁面動態建立 form 表單和 ifram 貞,設定 form 表單提交的目標為 ifram 貞, 將檔案域和要 post 的引數動態寫入 form 表單中,然後提交 from 表單。 通過 window.attach

利用ajax圖片並使用CURL呼叫介面

這是我第一次使用ajax上傳檔案,並且不通過form表單進行上傳,之前使用ajax上傳檔案時是藉助一個叫form.js的檔案,可以直接使用$.ajaxSumbmit直接提交表單,但這次不同,就是使用ajax上傳,並且將圖片資訊放在ajax要上傳的資料data陣列或物件中,怎麼

iOS整合七牛雲(圖片視訊音訊等檔案)

用的CocoaPods匯入SDK platform :ios,'9.0' target '專案名' do pod 'AFNetworking' pod 'Qiniu' end 匯入標頭檔案 #import<QiniuSDK.h> #i

asp.net圖片儲存檔名和路徑利用javascript顯示圖片預覽

<script type="text/javascript"> function show(id) { document.getElementById("Image1").src=id; } </script

使用springmvc 接收圖片在 手機 ios 圖片就不報錯 沒有就報下面這個錯誤然後在pc端跟安卓手機就不會有這個錯誤這是為什麼呢?

七月 18, 2018 4:04:22 下午 org.apache.catalina.core.StandardWrapperValve invoke 嚴重: Servlet.service() for servlet [springMVC] in context with

iOS原生api post圖片視訊

我之前在做檔案上傳的時候,不想用第三方的,於是就寫了一個簡單的圖片上傳方法 ------------.h檔案裡面寫一個這樣方法------- /**  *  非同步上傳檔案,視訊,圖片  *  *  @param name     名字  這個名字是和後臺

優化Recorder H5錄音:可邊錄邊轉碼伺服器支援微信提供Android IOS Hybrid App原始碼

目錄 一、Recorder H5錄音庫的特性 (1)瀏覽器支援 (2)功能支援 二、使用預覽截圖 (1)移動端H5 (2)IOS Hybrid App

使用 CKEditor 圖片 粘貼屏幕截圖

要求 license 回調 wan ade 做成 操作 rms 粘貼 之前寫過wangEditor,那真是好用,文檔也清晰,半天就搞定了,無奈沒有對應license,只好選擇別的。 外語一般,閱讀理解都靠蒙。CKEditor官方文檔看的我雲裏霧裏,國內的博客比較少,

百度WebUploader圖片圖片回顯編輯查看

set 唯一性 original 無需 同名 sch nag fin enum 頁面前端使用的是bootstrap,java後端springMVC , 上傳用的WebUploader,先說說上傳圖片,回顯編輯圖片在下一篇 如果僅僅只需要上傳圖片,不需要回顯進行編輯圖片,使用

html   圖片本頁預覽

html 上傳圖片 本頁預覽 直接上代碼<!DOCTYPE html><html><head><meta charset="UTF-8"><title>圖片上傳預覽</title><script type="text/j

C# 使用FileUpload控件圖片將文件轉換成二進制進行存儲與讀取

擴展 實現 bmi extension aaa 插入數據 問題 pup cat 狀況描述:   需要上傳文件,但是不想要保存到實體路徑下,便可以用該功能來實現。 效果圖:      點擊【Upload】按鈕,上傳文件到數據庫;   點擊【Preview】,預覽文件;

微信jssdk圖片 和 一次性好幾

pla can 參數錯誤 其他 屬性 使用 down pop menu //html模板 <div class="zhaopin_3_2"> <div id="bbb"></div> &

小程序圖片排隊

length 內容 ext 有效 ges mar 顯示 func 沒有 //沒有處理的wxml,但是有效果,可以簡單試驗一下 <view class=‘minbox1‘> <text class=‘red wzgs‘>*</text>

php 中使用cURL發送get/post請求圖片批處理

cit gda 抓取 記錄 rem 學習 網頁 lose XML https://mp.weixin.qq.com/s/8luqMEd8xt8oJxFLLCU1XA 文章正文 cURL是利用url語法規定傳輸文件和數據的工具。php中有curl拓展,一般用來實現網絡抓取,模

微信小程式圖片視訊及預覽

wxml <!-- 圖片預覽 --> <view class='preview-warp' wx:if="{{urls}}"> <image src='{{urls}}' /> </view> <view class="prew_video"

安卓專案實戰之強大的網路請求框架okGo使用詳解(六):擴充套件專案okServer更強大的下載功能支援斷點和工管理

OkGo與OkDownload的區別就是,OkGo只是簡單的做一個下載功能,不具備斷點下載,暫停等操作,但是這在很多時候已經能滿足需要了。 而有些app需要有一個下載列表的功能,就像迅雷下載一樣,每個下載任務可以暫停,可以繼續,可以重新下載,可以有下載優先順序,這時候OkDownload就有

layer 彈框 cropper 裁剪圖片thinkphp 3 使用 CropAvatar.class.php

最近要做一個上傳裁剪圖片功能,但是網上收出來的東西,知識點都是對的。但是就是沒說清楚,也無法連續起來用。 經過自己整理出來的一套程式碼,親測可用! 不用多說,直接上菜。 PS:搜尋引擎收錄的還是很垃圾...... 呼叫頁面,簡單程式碼(可複用) <img src="{$info.co

elementui 圖片到七牛雲上面去可以 【簡單/有效】

目的:elementui 上傳多張圖片到七牛雲上面去  第一步:效果說明 七牛雲顯示: 第二步:程式碼 2-1、這裡會用到兩個小東西,一個是 後臺獲取 token,一個是獲取一個隨機不重複字串(uuid用來做上傳檔案的名稱) token 獲取:https