<转> iOS开发网络篇—文件的上传

来源:互联网 发布:手机提速软件 编辑:程序博客网 时间:2024/05/16 15:26

转自iOS开发网络篇—文件的上传

说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中。本文介绍如何不借助第三方框架实现iOS开发中得文件上传。

  由于过程较为复杂,因此本文只贴出部分关键代码。

主控制器的关键代码:

YYViewController.m

#import "YYViewController.h"

#define YYEncode(str) [strdataUsingEncoding:NSUTF8StringEncoding]

@interface YYViewController ()

@end

@implementation YYViewController

- (void)viewDidLoad
{
    [superviewDidLoad];
    // Do anyadditional setup after loading the view, typically from anib.
}

- (void)upload:(NSString *)name filename:(NSString *)filenamemimeType:(NSString *)mimeType data:(NSData *)dataparmas:(NSDictionary *)params
{
    //文件上传
    NSURL *url =[NSURLURLWithString:@"http://192.168.1.200:8080/YYServer/upload"];
   NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];
   request.HTTPMethod = @"POST";
   
    //设置请求体
   NSMutableData *body = [NSMutableData data];
   
   
    //参数开始的标志
    [bodyappendData:YYEncode(@"--YY\r\n")];
    // name :指定参数名(必须跟服务器端保持一致)
    // filename: 文件名
    NSString*disposition = [NSString stringWithFormat:@"Content-Disposition:form-data; name="%@"; filename="%@"\r\n", name,filename];
    [bodyappendData:YYEncode(disposition)];
    NSString*type = [NSString stringWithFormat:@"Content-Type: %@\r\n",mimeType];
    [bodyappendData:YYEncode(type)];
   
    [bodyappendData:YYEncode(@"\r\n")];
    [bodyappendData:data];
    [bodyappendData:YYEncode(@"\r\n")];
   
   
    [paramsenumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
       // 参数开始的标志
       [body appendData:YYEncode(@"--YY\r\n")];
       NSString *disposition = [NSStringstringWithFormat:@"Content-Disposition: form-data;name="%@"\r\n", key];
       [body appendData:YYEncode(disposition)];

       [body appendData:YYEncode(@"\r\n")];
       [body appendData:YYEncode(obj)];
       [body appendData:YYEncode(@"\r\n")];
    }];
   
   
    //YY--\r\n
    [bodyappendData:YYEncode(@"--YY--\r\n")];
   request.HTTPBody = body;
   
    //设置请求头
    //请求体的长度
    [requestsetValue:[NSString stringWithFormat:@"%zd", body.length]forHTTPHeaderField:@"Content-Length"];
    //声明这个POST请求是个文件上传
    [requestsetValue:@"multipart/form-data; boundary=YY"forHTTPHeaderField:@"Content-Type"];
   
    //发送请求
   [NSURLConnection sendAsynchronousRequest:requestqueue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse *response, NSData *data, NSError*connectionError) {
       if (data) {
           NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:dataoptions:NSJSONReadingMutableLeaves error:nil];
           NSLog(@"%@", dict);
       } else {
           NSLog(@"上传失败");
       }
    }];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
    // Socket实现断点上传
   
   //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
//    UIImage*image = [UIImage imageNamed:@"test"];
//    NSData*filedata = UIImagePNGRepresentation(image);
//    [selfupload:@"file" filename:@"test.png" mimeType:@"image/png"data:filedata parmas:@{@"username" : @"123"}];
   
    //给本地文件发送一个请求
    NSURL*fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt"withExtension:nil];
    NSURLRequest*request = [NSURLRequest requestWithURL:fileurl];
   NSURLResponse *repsonse = nil;
    NSData *data= [NSURLConnection sendSynchronousRequest:requestreturningResponse:&repsonse error:nil];
   
    //得到mimeType
    NSLog(@"%@",repsonse.MIMEType);
    [selfupload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMETypedata:data parmas:@{
                                                                                             @"username" : @"999",
                                                                                             @"type" : @"XML"}];
}

@end

补充说明:

文件上传请求数据格式

部分文件的MIMEType

0 0