欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-05-24 19:50:59
...

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

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

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

static func uploadPortrait(image: UIImage, url: String) {    let manager = AFHTTPRequestOperationManager()    // fromData: AFN封装好的http header类,可以添加请求体    manager.POST(url, parameters: [:], constructingBodyWithBlock: { (fromData: AFMultipartFormData!) in        let pngData = UIImagePNGRepresentation(image)        // name必须和后台PHP接收的参数名相同($_FILES["file"])        // fileName为图片名        fromData.appendPartWithFileData(pngData, name: "file", fileName: "image.png", mimeType: "image/png")              // let jpegData = UIImageJPEGRepresentation(image, 0.3)        // fromData.appendPartWithFileData(jpegData, name: "file", fileName: "image.jpg", mimeType: "image/jpeg")    }, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) in        // 成功    }) { (operation: AFHTTPRequestOperation!, error: NSError!) in        // 失败    }   }
 0) {        echo $_FILES["file"]["error"]; // 错误代码    } else {                   $fillname = $_FILES['file']['name']; // 得到文件全名        $dotArray = explode('.', $fillname); // 以.分割字符串,得到数组        $type = end($dotArray); // 得到最后一个元素:文件后缀        $path = "../portrait/".md5(uniqid(rand())).'.'.$type; // 产生随机唯一的名字        move_uploaded_file( // 从临时目录复制到目标目录          $_FILES["file"]["tmp_name"], // 存储在服务器的文件的临时副本的名称          $path);        echo "成功";    } } else {    echo "文件类型不正确";}?>

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

// 使用OC封装#import @interface RequestPostUploadHelper : NSObject+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params;@end#import "RequestPostUploadHelper.h"@implementation RequestPostUploadHelper+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params {    [params setObject:uploadImage forKey:@"file"];    //分界线的标识符    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";    //根据url初始化request    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData                                                       timeoutInterval:10];    //分界线 --AaB03x    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];    //结束符 AaB03x--    NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];    //要上传的图片    UIImage *image=[params objectForKey:@"file"];    //得到图片的data    NSData* data = UIImagePNGRepresentation(image);    //http body的字符串    NSMutableString *body=[[NSMutableString alloc]init];    //参数的集合的所有key的集合    NSArray *keys= [params allKeys];    //遍历keys    for(int i = 0; i    
// 使用// Swiftstatic func uploadPortrait(image: UIImage, url:String) {    // 使用    let request = RequestPostUploadHelper.uploadImage(url, uploadImage: image, params: [:])    // 异步网络请求    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in        if error != nil {            // 失败        } else {            // 成功        }    }}

4.iOS图片转换为NSData,通过POST上传。PHP接收POST参数,将NSData的16进制编码转换为PHP支持的二进制,再写出文件保存

暂时没有找到办法,PHP接收到16进制编码后,使用算法转换为二进制后无法输出图片

5.二进制POST上传。PHP直接将数据保存为图片

暂时没有找到办法,iOS端使用NSData的getBytes无法转换为二进制