[关闭]
@SanMao 2015-08-11T15:33:41.000000Z 字数 3708 阅读 1153

文件上传

网络


MIME

重点:

  1. #import "ViewController.h"
  2. #import "NSString+MIME.h"
  3. #define kBoundary @"----xiaomage"
  4. #define kNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
  5. #define kEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]
  6. /*
  7. 普通POST:
  8. 请求头: 不需要设置额外的参数
  9. 请求体: 直接将数据转换成二进制放到请求体中即可
  10. 文件上传POST:
  11. 请求头: 必须写上一句参数
  12. Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1vk1tQb3tzVrbr3C
  13. 请求体: 必须按照固定的格式来编写, 并且一个换行/一个空格/一个字符都不能少
  14. >文件参数
  15. --和请求头中一模一样的边界\r\n
  16. Content-Disposition: form-data; name="file"; filename="文件名称"\r\n
  17. Content-Type: 上传的数据的MIMETYPE\r\n
  18. \r\n
  19. 具体数据
  20. \r\n
  21. --和请求头中一模一样的边界\r\n
  22. >非文件参数
  23. Content-Disposition: form-data; name="username"\r\n
  24. \r\n
  25. 值\r\n
  26. --结束符号--\r\n
  27. */
  28. /*
  29. 请求头:
  30. 边界 : xiaomage
  31. Content-Type: multipart/form-data; boundary=边界
  32. 请求体
  33. >文件参数
  34. --边界\r\n
  35. 参数\r\n
  36. 参数\r\n
  37. \r\n
  38. 具体数据\r\n
  39. --边界\r\n
  40. >非文件参数
  41. 参数\r\n
  42. \r\n
  43. 值\r\n
  44. --边界--\r\n
  45. */
  46. @interface ViewController ()
  47. @end
  48. @implementation ViewController
  49. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  50. {
  51. // NSLog(@"%@", [self mimetypeWithString:@"/Users/apple/Desktop/课堂共享/第2期(广州)2015年06月15日iOS大神班-0718.xls"]);
  52. NSLog(@"%@", [@"/Users/apple/Desktop/Demo.zip" mimetype]);
  53. }
  54. - (NSString *)mimetypeWithString:(NSString *)string
  55. {
  56. NSURL *url = [NSURL fileURLWithPath:string];
  57. NSURLRequest *request = [NSURLRequest requestWithURL:url];
  58. NSHTTPURLResponse *response = nil;
  59. [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
  60. return response.MIMEType;
  61. }
  62. - (void)upload{
  63. // 1.创建url
  64. NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
  65. // 2.创建request
  66. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  67. // 3.设置请求头
  68. // 设置请求头的目的: 告诉服务器是上传文件, 而不是传递普通参数
  69. NSString *field = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary];
  70. [request setValue:field forHTTPHeaderField:@"Content-Type"];
  71. /******************************************************************/
  72. // 4.设置请求体
  73. request.HTTPMethod = @"POST";
  74. NSMutableData *data = [NSMutableData data];
  75. /******************************************************************/
  76. // 4.1文件参数
  77. [data appendData:[[NSString stringWithFormat:@"--%@", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  78. [data appendData:kNewLine];
  79. [data appendData:kEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"abc.png\"")];
  80. [data appendData:kNewLine];
  81. // 目的: 告诉服务器上传的数据的真实类型
  82. [data appendData:kEncode(@"Content-Type: image/png")];
  83. [data appendData:kNewLine];
  84. [data appendData:kNewLine];
  85. UIImage *image = [UIImage imageNamed:@"pause"];
  86. NSData *imageData = UIImagePNGRepresentation(image);
  87. [data appendData:imageData];
  88. [data appendData:kNewLine];
  89. [data appendData:kNewLine];
  90. [data appendData:[[NSString stringWithFormat:@"--%@", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  91. [data appendData:kNewLine];
  92. /******************************************************************/
  93. // 4.2非文件参数
  94. [data appendData:kEncode(@"Content-Disposition: form-data; name=\"username\"")];
  95. [data appendData:kNewLine];
  96. [data appendData:kNewLine];
  97. [data appendData:kEncode(@"lnj")];
  98. [data appendData:kNewLine];
  99. /******************************************************************/
  100. // 4.3添加结束标记
  101. [data appendData:[[NSString stringWithFormat:@"--%@--", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
  102. [data appendData:kNewLine];
  103. request.HTTPBody = data;
  104. /******************************************************************/
  105. // 设置请求头
  106. [request setValue:[NSString stringWithFormat:@"%zd", data.length] forHTTPHeaderField:@"Content-Length"];
  107. // 5.利用NSURLConnection发送请求
  108. [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  109. NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
  110. }];
  111. }
  112. @end
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注