2023-05-12 开启多语言插件支持……

iOS上传图像到服务器PHP接收的几种方法

ios 苏 demo 4408℃ 0评论

1. 将图片转换为Base64编码,POST上传。PHP将Base64解码为二进制,再写出文件。缺点:不能上传较大的图片

  1. // iOS(Swift)
  2. function upload(image: UIImage, url: String) {
  3. let imageData = UIImageJPEGRepresentation(image, 0.3) // 将图片转换成jpeg格式的NSData,压缩到0.3
  4. let imageStr = imageData?.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) // 将图片转换为base64字符串
  5. let params: NSDictionary = ["file": imageStr!]
  6. let manager = AFHTTPRequestOperationManager()
  7.  
  8. // 采用POST的方式上传,因为POST对长度没有限制
  9. manager.POST(url, parameters: params, success: { (_: AFHTTPRequestOperation!, response: AnyObject!) in
  10. // 成功
  11. }) { (_: AFHTTPRequestOperation!, _: NSError!) in
  12. // 失败
  13. }
  14. }

保存图片

  1.  
  2. header('Content-type: text/json; charset=UTF-8');
  3. $base64 = $_POST["file"]; // 得到参数
  4. $img = base64_decode($base64); // 将格式为base64的字符串解码
  5. $path = "md5(uniqid(rand()))".".jpg"; // 产生随机唯一的名字作为文件名
  6. file_put_contents($path, $img); // 将图片保存到相应位置
  7.  

2.AFNetworking上传,PHP端通过正常接收网页上传方法来接收图片

  1. static func uploadPortrait(image: UIImage, url: String) {
  2. let manager = AFHTTPRequestOperationManager()
  3.  
  4. // fromData: AFN封装好的http header类,可以添加请求体
  5. manager.POST(url, parameters: [:], constructingBodyWithBlock: { (fromData: AFMultipartFormData!) in
  6. let pngData = UIImagePNGRepresentation(image)
  7. // name必须和后台PHP接收的参数名相同($_FILES["file"])
  8. // fileName为图片名
  9. fromData.appendPartWithFileData(pngData, name: "file", fileName: "image.png", mimeType: "image/png")
  10.  
  11. // let jpegData = UIImageJPEGRepresentation(image, 0.3)
  12. // fromData.appendPartWithFileData(jpegData, name: "file", fileName: "image.jpg", mimeType: "image/jpeg")
  13. }, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) in
  14. // 成功
  15. }) { (operation: AFHTTPRequestOperation!, error: NSError!) in
  16. // 失败
  17. }
  18. }
  1.  
  2. header('Content-type: text/json; charset=UTF-8' );
  3.  
  4. /**
  5. * $_FILES 文件上传变量,是一个二维数组,第一维保存上传的文件的数组,第二维保存文件的属性,包括类型、大小等
  6. * 要实现上传文件,必须修改权限为加入可写 chmod -R 777 目标目录
  7. */
  8.  
  9. // 文件类型限制
  10. // "file"名字必须和iOS客户端上传的name一致
  11. if (($_FILES["file"]["type"] == "image/gif")
  12. || ($_FILES["file"]["type"] == "image/jpeg")
  13. || ($_FILES["file"]["type"] == "image/png")
  14. || ($_FILES["file"]["type"] == "image/pjpeg"))
  15. // && ($_FILES["file"]["size"] < 20000)) // 小于20k
  16. {
  17. if ($_FILES["file"]["error"] > 0) {
  18. echo $_FILES["file"]["error"]; // 错误代码
  19. } else {
  20. $fillname = $_FILES['file']['name']; // 得到文件全名
  21. $dotArray = explode('.', $fillname); // 以.分割字符串,得到数组
  22. $type = end($dotArray); // 得到最后一个元素:文件后缀
  23.  
  24. $path = "../portrait/".md5(uniqid(rand())).'.'.$type; // 产生随机唯一的名字
  25.  
  26. move_uploaded_file( // 从临时目录复制到目标目录
  27. $_FILES["file"]["tmp_name"], // 存储在服务器的文件的临时副本的名称
  28. $path);
  29.  
  30. echo "成功";
  31. }
  32. } else {
  33. echo "文件类型不正确";
  34. }
  35.  

3.将图片封装在Http的请求报文中的请求体(body)中上传。也是AFN上传的原理

  1. // 使用OC封装
  2. #import
  3. @interface RequestPostUploadHelper : NSObject
  4. + (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params;
  5. @end
  6. #import "RequestPostUploadHelper.h"
  7. @implementation RequestPostUploadHelper
  8. + (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params {
  9. [params setObject:uploadImage forKey:@"file"];
  10. //分界线的标识符
  11. NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
  12. //根据url初始化request
  13. NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
  14. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
  15. timeoutInterval:10];
  16. //分界线 --AaB03x
  17. NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
  18. //结束符 AaB03x--
  19. NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
  20. //要上传的图片
  21. UIImage *image=[params objectForKey:@"file"];
  22. //得到图片的data
  23. NSData* data = UIImagePNGRepresentation(image);
  24. //http body的字符串
  25. NSMutableString *body=[[NSMutableString alloc]init];
  26. //参数的集合的所有key的集合
  27. NSArray *keys= [params allKeys];
  28. //遍历keys
  29. for(int i = 0; i < [keys count]; i++)
  30. {
  31. //得到当前key
  32. NSString *key = [keys objectAtIndex:i];
  33. //如果key不是file,说明value是字符类型,比如name:Boris
  34. if(![key isEqualToString:@"file"])
  35. {
  36. //添加分界线,换行
  37. [body appendFormat:@"%@\r\n",MPboundary];
  38. //添加字段名称,换2行
  39. [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  40. //添加字段的值
  41. [body appendFormat:@"%@\r\n",[params objectForKey:key]];
  42. }
  43. }
  44. ////添加分界线,换行
  45. [body appendFormat:@"%@\r\n",MPboundary];
  46. //声明file字段,文件名为image.png
  47. [body appendFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"image.png\"\r\n"];
  48. //声明上传文件的格式
  49. [body appendFormat:@"Content-Type: image/png\r\n\r\n"];
  50. //声明结束符:--AaB03x--
  51. NSString *end=[[NSString alloc] initWithFormat:@"\r\n%@",endMPboundary];
  52. //声明myRequestData,用来放入http body
  53. NSMutableData *myRequestData = [NSMutableData data];
  54. //将body字符串转化为UTF8格式的二进制
  55. [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
  56. //将image的data加入
  57. [myRequestData appendData:data];
  58. //加入结束符--AaB03x--
  59. [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  60. //设置HTTPHeader中Content-Type的值
  61. NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
  62. //设置HTTPHeader
  63. [request setValue:content forHTTPHeaderField:@"Content-Type"];
  64. //设置Content-Length
  65. [request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
  66. //设置http body
  67. [request setHTTPBody:myRequestData];
  68. //http method
  69. [request setHTTPMethod:@"POST"];
  70. return request;
  71. }
  72. @end
  1. // 使用
  2. // Swift
  3. static func uploadPortrait(image: UIImage, url:String) {
  4. // 使用
  5. let request = RequestPostUploadHelper.uploadImage(url, uploadImage: image, params: [:])
  6. // 异步网络请求
  7. NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in
  8. if error != nil {
  9. // 失败
  10. } else {
  11. // 成功
  12. }
  13. }
  14. }
  1. // PHP代码和上一步相同

4.iOS图片转换为NSData,通过POST上传。PHP接收POST参数,将NSData的16进制编码转换为PHP支持的二进制,再写出文件保存
暂时没有找到办法,PHP接收到16进制编码后, 使用算法 转换为二进制后无法输出图片
5.二进制POST上传。PHP直接将数据保存为图片
暂时没有找到办法,iOS端使用NSData的getBytes无法转换为二进制

打赏

转载请注明:苏demo的别样人生 » iOS上传图像到服务器PHP接收的几种方法

   如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (0)or分享 (0)
收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论