iOS文件上傳

jopen 10年前發布 | 48K 次閱讀 IOS iOS開發 移動開發

在ios里來上傳文件的方法很多,比如把文件base64直接post,本來打算這樣做的,發現各種不爽,服務端收起來也各種不爽,所以干脆用標準的http上傳協議mutipart來搞個上傳就好,具體代碼如下

頭文件

    @interface HttpRequest : NSObject

+(id)upload:(NSString *)url widthParams:(NSDictionary *)params;  

@end  

@interface FileDetail : NSObject  
@property(strong,nonatomic) NSString *name;  
@property(strong,nonatomic) NSData *data;  
+(FileDetail *)fileWithName:(NSString *)name data:(NSData *)data;  
@end  </pre><br />

main文件

</div> </div>

    //
// HttpRequest.m
// recofm
//
// Created by reco on 13-12-25.
// Copyright (c) 2013年 reco. All rights reserved.
//

#import "HttpRequest.h"  


#define BOUNDARY @"----------cH2gL6ei4Ef1KM7cH2KM7ae0ei4gL6"  

@implementation HttpRequest  

+(id)upload:(NSString *)url widthParams:(NSDictionary *)params {  

    NSError *err = nil;  
    NSMutableURLRequest *myRequest = [ [NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:0];  
    [myRequest setHTTPMethod:@"POST"];  
    [myRequest setValue:[@"multipart/form-data; boundary=" stringByAppendingString:BOUNDARY] forHTTPHeaderField:@"Content-Type"];  

    NSMutableData *body = [NSMutableData data];  

    for(NSString *key in params) {  
        id content = [params objectForKey:key];  
        if ([content isKindOfClass:[NSString class]] || [content isKindOfClass:[NSNumber class]]) {  
            NSString *param = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n",BOUNDARY,key,content,nil];  
            [body appendData:[param dataUsingEncoding:NSUTF8StringEncoding]];  

        } else if([content isKindOfClass:[FileDetail class]]) {  

            FileDetail *file = (FileDetail *)content;  

            NSString *param = [NSString stringWithFormat:@"--%@\r\nContent-Disposition: form-data; name=\"%@\";filename=\"%@\"\r\nContent-Type: application/octet-stream\r\n\r\n",BOUNDARY,key,file.name,nil];  
            [body appendData:[param dataUsingEncoding:NSUTF8StringEncoding]];  
            [body appendData:file.data];  
            [body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];  
        }  
    }  
    NSString *endString = [NSString stringWithFormat:@"--%@--",BOUNDARY];  
    [body appendData:[endString dataUsingEncoding:NSUTF8StringEncoding]];  
    [myRequest setHTTPBody:body];  

    NSData *returnData = [NSURLConnection sendSynchronousRequest:myRequest returningResponse:nil error:&err];  




    id jsonObj = [NSJSONSerialization JSONObjectWithData:returnData options:noErr error:nil];  

    return jsonObj;  
}  




@end  


@implementation FileDetail  
+(FileDetail *)fileWithName:(NSString *)name data:(NSData *)data {  
    FileDetail *file = [[self alloc] init];  
    file.name = name;  
    file.data = data;  
    return file;  
}  
@end  </pre><br />

使用方法

NSData *imageData = UIImageJPEGRepresentation(image,0.8);  
   FileDetail *file = [FileDetail fileWithName:@"avatar.jpg" data:imageData];  
   NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:  
                           file,@"file",  
                           @"upload",@"action",  
                           nil nil];  
   NSDictionary *result = [HttpRequest upload:@"http://upload.corp.reco.cn/uploadimage" widthParams:params];  
   NSLog(@"%@",result);  
</div> </div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!