这篇博客用于实现iOS客户端通过POST请求,将图片上传到服务器上。服务器端语言采用PHP,服务器环境使用MAMP搭建。先使用浏览器测试图片是否可以上传,浏览器测试成功之后再测试iOS客户端是否可以成功上传图片。

服务端代码:

upload_file.php

  1. <?php
  2.  
  3. if ((($_FILES["file"]["type"] == "image/gif")
  4. || ($_FILES["file"]["type"] == "image/jpeg")
  5. || ($_FILES["file"]["type"] == "image/pjpeg"))
  6. && ($_FILES["file"]["size"] < 20000000))
  7. {
  8. if ($_FILES["file"]["error"] > 0)
  9. {
  10. echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
  11. }
  12. else
  13. {
  14. echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  15. echo "Type: " . $_FILES["file"]["type"] . "<br />";
  16. echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  17. echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
  18.  
  19. if (file_exists("upload/" . $_FILES["file"]["name"]))
  20. {
  21. echo $_FILES["file"]["name"] . " already exists. ";
  22. }
  23. else
  24. {
  25. move_uploaded_file($_FILES["file"]["tmp_name"],
  26. "upload/" . $_FILES["file"]["name"]);
  27. echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  28. }
  29. }
  30. }
  31. else
  32. {
  33. echo "Invalid file";
  34. }
  35. ?>

浏览器测试代码:

upload.html

  1. <html>
  2. <body>
  3.  
  4. <form action="upload_file.php" method="post"
  5. enctype="multipart/form-data">
  6. <label for="file">Filename:</label>
  7. <input type="file" name="file" id="file" />
  8. <br />
  9. <input type="submit" name="submit" value="Submit" />
  10. </form>
  11.  
  12. </body>
  13. </html>

MAMP服务器的目录结构如下:(新建一个upload文件夹用于存放图片,将upload文件夹和upload.html、upload_file.php放在同一个目录下)

iOS客户端代码:

ViewController.m

  1. #import "ViewController.h"
  2.  
  3. static NSString *boundry = @"----------V2ymHFg03ehbqgZCaKO6jy";//设置边界
  4.  
  5. @interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate,NSURLSessionTaskDelegate>
  6. @end
  7.  
  8. @implementation ViewController
  9.  
  10. - (void)viewDidLoad {
  11. [super viewDidLoad];
  12. // Do any additional setup after loading the view, typically from a nib.
  13. }
  14.  
  15. - (void)didReceiveMemoryWarning {
  16. [super didReceiveMemoryWarning];
  17. // Dispose of any resources that can be recreated.
  18. }
  19.  
  20. #pragma mark-打开相册
  21. - (IBAction)openAlbumClicked:(UIButton *)sender {
  22.  
  23. UIImagePickerController *picController = [[UIImagePickerController alloc] init];
  24.  
  25. picController.delegate = self;
  26.  
  27. [self presentViewController:picController animated:YES
  28. completion:nil];
  29.  
  30. }
  31.  
  32. #pragma mark-代理方法
  33. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
  34.  
  35. NSLog(@"选择图片:\n%@",info);
  36.  
  37. [self uploadDataWithImage:info[@"UIImagePickerControllerOriginalImage"]];
  38.  
  39. [picker dismissViewControllerAnimated:YES completion:nil];
  40. }
  41.  
  42. /**
  43. 上传图片
  44. */
  45. - (void)uploadDataWithImage:(UIImage *)img{
  46.  
  47. NSURL *url = [NSURL URLWithString:@"http://10.51.3.160:8888/upload_file.php"];
  48. NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:];
  49.  
  50. //设置Method
  51. urlRequest.HTTPMethod = @"POST";
  52.  
  53. //4.设置请求头
  54. //在请求头中添加content-type字段
  55. NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8;boundary=%@",boundry];
  56. [urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"];
  57.  
  58. NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  59.  
  60. //NSURLSession
  61. NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
  62.  
  63. //定义上传操作
  64. NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:urlRequest fromData:[self getBodydataWithImage:img] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
  65. NSLog(@"响应结果:%@", response);
  66. NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  67. NSLog(@"返回数据:\n%@",str);
  68. }];
  69.  
  70. [uploadTask resume];
  71. }
  72.  
  73. - (NSData *)getBodydataWithImage:(UIImage *)image
  74. {
  75. //把文件转换为NSData
  76. NSData *fileData = UIImageJPEGRepresentation(image, 0.8);
  77.  
  78. //文件名
  79. NSString *fileName=@"test";
  80.  
  81. //1.构造body string
  82. NSMutableString *bodyString = [[NSMutableString alloc] init];
  83.  
  84. //2.拼接body string
  85. //(1)file_name
  86. [bodyString appendFormat:@"--%@\r\n",boundry];
  87. [bodyString appendFormat:@"Content-Disposition: form-data; name=\"FileName\"\r\n"];
  88. [bodyString appendFormat:@"Content-Type: text/plain; charset=\"utf-\"\r\n\r\n"];
  89. [bodyString appendFormat:@"aaa%@.jpg\r\n",fileName];
  90.  
  91. //(2)PostID
  92. // [bodyString appendFormat:@"--%@\r\n",boundry];
  93. // [bodyString appendFormat:@"Content-Disposition: form-data; name=\"PostID\"\r\n"];
  94. // [bodyString appendFormat:@"Content-Type: text/plain; charset=\"utf-8\"\r\n\r\n"];
  95. // [bodyString appendFormat:@"%@\r\n",self.uuID];
  96.  
  97. //(3)pic
  98. [bodyString appendFormat:@"--%@\r\n",boundry];
  99. [bodyString appendFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpg\"\r\n",fileName];
  100. [bodyString appendFormat:@"Content-Type: image/jpeg\r\n\r\n"];
  101. //[bodyString appendFormat:@"Content-Type: application/octet-stream\r\n\r\n"];
  102.  
  103. //3.string --> data
  104. NSMutableData *bodyData = [NSMutableData data];
  105. //拼接的过程
  106. //前面的bodyString, 其他参数
  107. [bodyData appendData:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
  108. //图片数据
  109. [bodyData appendData:fileData];
  110.  
  111. //4.结束的分隔线
  112. NSString *endStr = [NSString stringWithFormat:@"\r\n--%@--\r\n",boundry];
  113. //拼接到bodyData最后面
  114. [bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]];
  115.  
  116. return bodyData;
  117. }
  118.  
  119. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
  120.  
  121. CGFloat progress = totalBytesSent * 1.0 / totalBytesExpectedToSend;
  122. NSLog(@"上传进度:%f%%",progress*);
  123.  
  124. }
  125.  
  126. /*
  127. 上传成功
  128. */
  129. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
  130. NSLog(@"上传成功! Error:%@",error);
  131. }
  132.  
  133. @end

iOS客户端Demo

iOS+PHP图片上传的更多相关文章

  1. IOS开发-图片上传

    目前IOS端开发,图片上传到服务器分为两种,一种是直接上到服务器,一种是借助第三方储存(减少服务器压力). 一.直接上传到服务器 /** * 代码演示 */ //*******UIImagePNGRe ...

  2. ios base64图片上传失败问题

    今天做图片上传,后台用的是base64解密图片二进制文件,以前都是用表单上传来解决图片上传的,现在后台没有人改,所以研究下base64上传. 需要将图片base64加密,但是调用 [data base ...

  3. IOS 视频.图片上传服务器

    //上传视频 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.requestSerializer. ...

  4. iOS 解决图片上传到服务器旋转90度的问题(图片倒置)

    //使用swift的朋友们可以,把这个所在的类的.h,在-Header-Swift.h中一用一下. - (UIImage *)fixOrientation:(UIImage *)aImage { if ...

  5. iOS 开发之路(WKWebView内嵌HTML5之图片上传) 五

    HTML5页面的图片上传功能在iOS端的实现. 首先,页面上用的是plupload组件,在wkwebview上存在两个坑需要修复才能正常使用. 问题:在webview上点击选择照片/相机拍摄,就会出现 ...

  6. [iOS AFNetworking框架实现HTTP请求、多文件图片上传下载]

    简单的JSON的HTTP传输就不说了,看一个简单的DEMO吧. 主要明白parameters是所填参数,类型是字典型.我把这部分代码封装起来了,以便多次调用.也许写在一起更清楚点. #pragma m ...

  7. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题

    微信多图片上传必须挨个上传,也就是不能并行,得串行: 那么我们可以定义一个如下所示的上传函数: var serverIds = []; function uploadImages(localImage ...

  8. iOS 七牛云上传并获取图片----【客户端】

           最近做了七牛云存储的有关内容,涉及到与后台交互获取验证的token,无奈,后台自命清高,不与理会,没办法呀,于是自己搞呗.首先呢在在七牛上注册一个账号,然后呢添加一个存储空间这时候空间名 ...

  9. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

随机推荐

  1. NumPy入门基础【2】

    通用函数ufunc 一元ufunc举例: 1.abs.fabs:计算绝对值,fabs更快 2.sqrt:计算各元素的平方根,相当于arr0.5 3.square:计算各元素的平方根,相当远arr2 4 ...

  2. WCF基础之序列化

    wcf是基于消息进行通信的,这篇就是简单说下序列化引擎是如何将.net object转化为xml消息.一般情况下很少用到这些,你只需定义数据协定之类的或者指定相应的序列化引擎,然后设置相应的特性就好. ...

  3. Netty Redis 亿级流量 高并发 实战 (长文 修正版)

    目录 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -30[ 博客园 总入口 ] 写在前面 1.1. 快速的能力提升,巨大的应用价值 1.1.1. 飞速提升能力,并且满足实际开发要求 1 ...

  4. output value . Sigmoid neurons are similar to perceptrons, but modified so that small changes in their weights and bias cause only a small change in their output.

    http://neuralnetworksanddeeplearning.com/chap1.html . Sigmoid neurons are similar to perceptrons, bu ...

  5. html5 (新一代的html)

    简介 h5的新特性: cavas / video / audio / cache / element / form 最小的h5文档: <!DOCTYPE html> <html> ...

  6. STL中vector怎么实现邻接表

    最近,同期的一位大佬给我出了一道题目,改编自 洛谷 P2783 有机化学之神偶尔会做作弊 这道题好坑啊,普通链表过不了,只能用vector来存边.可能更快一些吧? 所以,我想记录并分享一下vector ...

  7. react create app ,nginx服务器配置

    server{ listen 80; server_name www.domain.com domain.com; location ~* \.js$ { root /home/hard/Projec ...

  8. appium 移动web样例脚本

    简单介绍 这是一个使用appium操作移动端chrome浏览器的样例程序. 样例程序 脚本实现的功能是:打开浏览器-->跳转到百度首页-->输入appium-->点击搜索按钮--&g ...

  9. mysql练习(待补充)

    2.查询‘生物’课程比‘物理’课程成绩高的所有学生的学号 思路: 获取所有生物课程的人(学号,成绩)-临时表 获取所有物理课程的人(学号,成绩)-临时表 根据学号连接两个临时表: 学号 生物成绩 物理 ...

  10. PAT 天梯赛 L3-013. 非常弹的球 【物理】

    题目链接 https://www.patest.cn/contests/gplt/L3-013 思路 将速度 分解成 竖直方程 和 垂直方向 当 角度为 45° 时 射出的时候 水平方向 最远 所以 ...