1. 程式人生 > >使用最原始的http-post方式上傳圖片 ,上傳工具類已封裝 可直接使用

使用最原始的http-post方式上傳圖片 ,上傳工具類已封裝 可直接使用

// 上傳工具類的 .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檔案和上傳圖片一樣 可以直接使用此封裝的工具類 只需要給方法中提供相應的引數即可使用 。