zoukankan      html  css  js  c++  java
  • iOS多线程与网络开发之小文件上传

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

    假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 

    我要捐赠: 点击捐赠

    Cocos2d-X源代码下载:点我传送

    游戏官方下载:http://dwz.cn/RwTjl

    游戏视频预览:http://dwz.cn/RzHHd

    游戏开发博客:http://dwz.cn/RzJzI

    游戏源代码传送http://dwz.cn/Nret1


    A.文件上传
    思路:
    发送文件数据给server
    使用post请求
    必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type
    请求体:文件数据
    文件上传的格式要求十分严格。必须严格遵守
    因为是一次性载入文件到内存上传,所以仅仅能用于小文件上传
     
    B.实现
    1.设置POST请求
    (1)使用POST请求方法
    (2)设置请求头
    设置内容长度、内容类型、切割线
     
    (3)设置请求体
    NSMutableData *body = [NSMutableData data];
    切割线 + 换行
    内容描写叙述 + 换行
    内容类型 + 换行
    换行
    文件二进制数据 + 换行
    切割线--
     
     
    multipart/form-data 中的内容
    Image(46)
     
     
    比如使用chrome上传一张图片:
    5A66D35E-E958-49A9-AD92-9C54E4CCFA83
     
    (4)使用本地请求获取某种文件类型的MIMEType
    复制代码
     1 /** 取得本地文件的MIMEType */
     2 - (void) getMIMEType {
     3     // Socket 实现断点上传
     4    
     5     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
     6     //    UIImage *image = [UIImage imageNamed:@"test"];
     7     //    NSData *filedata = UIImagePNGRepresentation(image);
     8     //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
     9    
    10     // 给本地文件发送一个请求
    11     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
    12     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
    13     NSURLResponse *repsonse = nil;
    14     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
    15    
    16     // 得到mimeType
    17     NSLog(@"%@", repsonse.MIMEType);
    18     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}];
    19 }
    复制代码
     
     
    附:常见文件类型的MIMEType
    Image(47)
     
    复制代码
      1 //
      2 //  ViewController.m
      3 //  UploadFileDemo
      4 //
      5 //  Created by haomengzhu on 15/1/28.
      6 //  Copyright (c) 2015年 haomengzhu. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 
     11 #define UTF8Encode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
     12 
     13 @interface ViewController ()
     14 
     15 - (IBAction)upload;
     16 
     17 @end
     18 
     19 @implementation ViewController
     20 
     21 - (void)viewDidLoad {
     22     [super viewDidLoad];
     23     // Do any additional setup after loading the view, typically from a nib.
     24 }
     25 
     26 - (void)didReceiveMemoryWarning {
     27     [super didReceiveMemoryWarning];
     28     // Dispose of any resources that can be recreated.
     29 }
     30 
     31 - (IBAction)upload {
     32     UIImage *image = [UIImage imageNamed:@"IMG_0413"];
     33     NSData *imageData = UIImagePNGRepresentation(image);
     34     [self upload:@"uploadedFile" filename:@"IMG_0413.PNG" mimeType:@"image/png" data:imageData parmas:nil];
     35 }
     36 
     37 - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params
     38 {
     39     // 文件上传
     40     NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/upload"];
     41     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     42     request.HTTPMethod = @"POST";
     43    
     44     // 设置请求体
     45     NSMutableData *body = [NSMutableData data];
     46    
     47     /***************文件參数***************/
     48     // 參数開始的标志
     49     [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary
    ")];
     50     // name : 指定參数名(必须跟server端保持一致)
     51     // filename : 文件名称
     52     NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"; filename="%@"
    ", name, filename];
     53     [body appendData:UTF8Encode(disposition)];
     54     NSString *type = [NSString stringWithFormat:@"Content-Type: %@
    ", mimeType];
     55     [body appendData:UTF8Encode(type)];
     56    
     57     [body appendData:UTF8Encode(@"
    ")];
     58     [body appendData:data];
     59     [body appendData:UTF8Encode(@"
    ")];
     60    
     61     /***************普通參数***************/
     62     [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
     63         // 參数開始的标志
     64         [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary
    ")];
     65         NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name="%@"
    ", key];
     66         [body appendData:UTF8Encode(disposition)];
     67        
     68         [body appendData:UTF8Encode(@"
    ")];
     69         [body appendData:UTF8Encode(obj)];
     70         [body appendData:UTF8Encode(@"
    ")];
     71     }];
     72    
     73     /***************參数结束***************/
     74     // HelloVoidWorldBoundary--
    
     75     [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary--
    ")];
     76     request.HTTPBody = body;
     77    
     78     // 设置请求头
     79     // 请求体的长度
     80     [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
     81     // 声明这个POST请求是个文件上传
     82     [request setValue:@"multipart/form-data; boundary=HelloVoidWorldBoundary" forHTTPHeaderField:@"Content-Type"];
     83    
     84     // 发送请求
     85     [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
     86         NSLog(@"開始上传~~~");
     87         if (data) {
     88             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
     89             NSLog(@"%@", dict);
     90         } else {
     91             NSLog(@"上传失败");
     92         }
     93     }];
     94 }
     95 
     96 /** 取得本地文件的MIMEType */
     97 - (void) getMIMEType {
     98     // Socket 实现断点上传
     99    
    100     //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType
    101     //    UIImage *image = [UIImage imageNamed:@"test"];
    102     //    NSData *filedata = UIImagePNGRepresentation(image);
    103     //    [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}];
    104    
    105     // 给本地文件发送一个请求
    106     NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil];
    107     NSURLRequest *request = [NSURLRequest requestWithURL:fileurl];
    108     NSURLResponse *repsonse = nil;
    109     NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];
    110    
    111     // 得到mimeType
    112     NSLog(@"%@", repsonse.MIMEType);
    113     [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}];
    114 }
    115 
    116 
    117 @end
    复制代码
     
     

    郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。

    假设文章对您有所帮助,欢迎给作者捐赠。支持郝萌主。捐赠数额任意,重在心意^_^ 

    我要捐赠: 点击捐赠

    Cocos2d-X源代码下载:点我传送

    游戏官方下载:http://dwz.cn/RwTjl

    游戏视频预览:http://dwz.cn/RzHHd

    游戏开发博客:http://dwz.cn/RzJzI

    游戏源代码传送http://dwz.cn/Nret1

  • 相关阅读:
    AnyVal与AnyRef
    安装Zookeeper
    Kafka
    ZooKeeper总结
    Idea中JDK为1.8,还提示Diamond types are not supported at this language level
    Hive 和 Mysql
    Spark练习代码
    响应状态码
    http简介
    csrf
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7207279.html
Copyright © 2011-2022 走看看