使用最原始的http-post方式上傳圖片 ,上傳工具類已封裝 可直接使用
阿新 • • 發佈:2019-01-27
// 上傳工具類的 .h檔案
#import <Foundation/Foundation.h>
@interface IMPhotoPostTool : NSObject
+ (NSMutableURLRequest *)upload:(NSString *)filename name:(NSString *)name mimeType:(NSString *)mimeType fileData:(NSData *)fileData params:(NSDictionary *)params;
@end
// 上傳工具類的 .m實現 <pre name="code" class="objc">filename #import "IMPhotoPostTool.h" #define IMFileBoundary @"xxx"// 此名稱可以自己定義 #define IMNewLien @"\r\n" #define IMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] @implementation IMPhotoPostTool /** * filename 為上傳給伺服器圖片的名稱 是自己定義的 * name 為伺服器那邊 設定的名稱 向伺服器索取即可 * mimeType 為上傳的型別 * fileData 為上傳的二進位制資料流 和伺服器的傳輸的資料都為二進位制資料 */ + (NSMutableURLRequest *)upload:(NSString *)filename name:(NSString *)name mimeType:(NSString *)mimeType fileData:(NSData *)fileData params:(NSDictionary *)params{ // 1.請求路徑 NSURL *url = [NSURL URLWithString:PhotoPostUrl]; // 此處的PhotoPostUrl 為上傳的圖片的URL地址 由伺服器提供
// 2.建立一個POST請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 3.設定請求體 NSMutableData *body = [NSMutableData data]; // 3.1.檔案引數 [body appendData:IMEncode(@"--")]; [body appendData:IMEncode(IMFileBoundary)]; [body appendData:IMEncode(IMNewLien)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"",name, filename]; [body appendData:IMEncode(disposition)]; [body appendData:IMEncode(IMNewLien)]; NSString *type = [NSString stringWithFormat:@"Content-Type: %@", mimeType]; [body appendData:IMEncode(type)]; [body appendData:IMEncode(IMNewLien)]; [body appendData:IMEncode(IMNewLien)]; [body appendData:fileData]; [body appendData:IMEncode(IMNewLien)]; // 3.2.非檔案引數 [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [body appendData:IMEncode(@"--")]; [body appendData:IMEncode(IMFileBoundary)]; [body appendData:IMEncode(IMNewLien)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"", key]; [body appendData:IMEncode(disposition)]; [body appendData:IMEncode(IMNewLien)]; [body appendData:IMEncode(IMNewLien)]; [body appendData:IMEncode([obj description])]; [body appendData:IMEncode(IMNewLien)]; }]; // 3.3結束標記 [body appendData:IMEncode(@"--")]; [body appendData:IMEncode(IMFileBoundary)]; [body appendData:IMEncode(@"--")]; [body appendData:IMEncode(IMNewLien)]; request.HTTPBody = body; // 4.設定請求頭(告訴伺服器這次傳給你的是檔案資料,告訴伺服器現在傳送的是一個檔案上傳請求) NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", IMFileBoundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; return request; }
在控制器中的使用
NSDictionary *params = @{ @"usename" : @"xiaoming", @"pasword" : @"123456" }; NSMutableURLRequest *request = [IMPhotoPostTool upload:@"photo.jpeg" name:@"uploadfile" mimeType:@"image/jpeg" fileData:imageData params:params]; // 採用非同步請求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { IMLog(@"------%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); }];
附加:提供一個獲取的mimeType的封裝
- (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;
}
總結:上傳其他諸如text檔案和上傳圖片一樣 可以直接使用此封裝的工具類 只需要給方法中提供相應的引數即可使用 。