简单的JSON的HTTP传输就不说了,看一个简单的DEMO吧。

主要明白parameters是所填参数,类型是字典型。我把这部分代码封装起来了,以便多次调用。也许写在一起更清楚点。

  1. #pragma mark - JSON方式post提交数据
  2. - (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail
  3. {
  4. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  5. // 设置请求格式
  6. manager.requestSerializer = [AFJSONRequestSerializer serializer];
  7. // 设置返回格式
  8. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  9. [manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
  10. //查看返回数据
  11. //NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
  12. if (success) {
  13. success(responseObject);
  14. }
  15. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  16. NSLog(@"%@", error);
  17. if (fail) {
  18. fail();
  19. }
  20. }];
  21. }

下面是调用方式:返回的json会存在id的变量里,这个jsondataAFN框架有自动转换成字典型,用健直接可以取到值。

  1. //jason解析,根据上传id从数据库取出用户信息
  2. -(void)jasontest{
  3. //访问的URL
  4. NSString *url = @"http://localhost:8888/chepaishibie/selectuser.php";
  5. //需要传进去的参数
  6. NSDictionary *parameter = @{@"Driverid": @""};
  7. //GET或者POST请求
  8. [[ShenAFN sharedInstance] JSONDataWithUrl:url parameter:parameter success:^(id jsondata) {
  9. //返回的字符,并输出
  10. NSLog(@"success:\n%@", jsondata);
  11. //如果是其他字符,可以用以下语句解析返回的语句
  12. //NSString *result = [[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding];
  13. //如果是json格式,可以通过这种方式获取变量
  14. id info1=jsondata[@"info1"];
  15. _personname=info1[@"personname"];
  16. } fail:^{
  17. NSLog(@"请求失败");
  18. }];
  19. }

网上实现多图片的上传的教程几乎没,所以在这里特别说下。方便别人学习。

首先看下浏览器端的上传实现:http://www.w3school.com.cn/php/php_file_upload.asp

一般情况下for表单都是默认键值对传输的,当表单类型设置为enctype="multipart/form-data"时,传输会按照二进制传输。

PHP后台和W3C教程基本一样,我稍微改了下,用foreach就能实现动态的单个文件上传或者多个文件上传了。

说明一下,上传文件都放在$_FILES的数组里,获取方式$_FILES["file0"]或者$_FILES["file1"],这个file0就是再下面iOS工程里定义的name。

PHP后台代码如下:

  1. <?
  2. header("Content-type: text/html; charset=UTF-8");
  3. include("../configmysql.php");
  4. mysql_select_db("chepaiDB",$q); //数据库
  5.  
  6. //POST获取键值对参数
  7. $TEMPid=$_POST['Driverid'];
  8. echo "\nDriverid is ".$TEMPid."\n";
  9.  
  10. foreach ($_FILES as $_eachFile) {
  11. //file文件处理
  12. if ($_eachFile["error"] > 0)
  13. {
  14. echo "错误: " . $_eachFile["error"] . "\n";
  15. }
  16. else
  17. {
  18. echo "文件名: " . $_eachFile["name"] . "\n";
  19. echo "类型: " . $_eachFile["type"] . "\n";
  20. echo "大小: " . ($_eachFile["size"] / 1024) . " Kb\n";
  21. }
  22. if (file_exists("uploadimage/" . $_eachFile["name"]))
  23. {
  24. echo $_eachFile["name"] . " 文件已经存在. ";
  25. }
  26. else
  27. {
  28. move_uploaded_file($_eachFile["tmp_name"],
  29. "uploadimage/" . $_eachFile["name"]);
  30. echo "文件已经被存储到: " . "uploadimage/" . $_eachFile["name"]."\n";
  31. }
  32. }
  33. /*
  34. //file文件处理
  35. if ($_FILES["file"]["error"] > 0)
  36. {
  37. echo "错误: " . $_FILES["file"]["error"] . "\n";
  38. }
  39. else
  40. {
  41. echo "文件名: " . $_FILES["file"]["name"] . "\n";
  42. echo "类型: " . $_FILES["file"]["type"] . "\n";
  43. echo "大小: " . ($_FILES["file"]["size"] / 1024) . " Kb\n";
  44. }
  45. if (file_exists("uploadimage/" . $_FILES["file"]["name"]))
  46. {
  47. echo $_FILES["file"]["name"] . " 文件已经存在. ";
  48. }
  49. else
  50. {
  51. move_uploaded_file($_FILES["file"]["tmp_name"],
  52. "uploadimage/" . $_FILES["file"]["name"]);
  53. echo "文件已经被存储到: " . "uploadimage/" . $_FILES["file"]["name"]."\n";
  54. }
  55. */
  56. ?>

在AFN框架里,FORMDATA的体现,就是[manager POST:urlStr parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {}这个函数是专门用于formData上传的,还可携带其他参数。

单图上传:

  1. #pragma mark - 单个图片上传
  2. - (void)uploadimgWithurl:(NSString *)urlStr image:(UIImage *)image fileName:(NSString *)fileName success:(void (^)(id responseObject))success fail:(void (^)())fail
  3. {
  4. //需要传递的参数,jason格式
  5. NSDictionary *parameter = @{@"Driverid": @""};
  6. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  7. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  8. [manager POST:urlStr parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  9. /*文件命名参考代码
  10. // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
  11. // 要解决此问题,
  12. // 可以在上传时使用当前的系统事件作为文件名
  13. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  14. // 设置时间格式
  15. formatter.dateFormat = @"yyyyMMddHHmmss";
  16. NSString *str = [formatter stringFromDate:[NSDate date]];
  17. NSString *newfileName = [NSString stringWithFormat:@"%@.png", str];
  18. */
  19. [formData appendPartWithFileData:UIImagePNGRepresentation(image) name:@"file" fileName:fileName mimeType:@"image/png"];
  20. } success:^(AFHTTPRequestOperation *operation, id responseObject) {
  21. if (success) {
  22. //NSLog(@"success\n");
  23. success(responseObject);
  24. }
  25. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  26. if (fail) {
  27. //NSLog(@"fail\n");
  28. fail();
  29. }
  30. }];
  31. }

调用:

  1. //单图片上传
  2. -(void)uploadimg{
  3. NSString *url = @"http://localhost:8888/chepaishibie/uploadimage.php";
  4. UIImage *image=[UIImage imageNamed:@"swift"];
  5. [[ShenAFN sharedInstance] uploadimgWithurl:url image:image fileName:@"myswift.png" success:^(id jsondata) {
  6. NSString *result = [[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding];
  7. NSLog(@"%@", result);
  8. } fail:^{
  9. NSLog(@"请求失败");
  10. }];
  11. }

多图片上传:主要是利用appendPartWithFileData函数,一个for循环把NSMutablearray里的图片都添加进去。

  1. - (void)uploadMutableimgWithurl:(NSString *)urlStr imagearray:(NSMutableArray *)imgarray success:(void (^)(id responseObject))success fail:(void (^)())fail
  2. {
  3. //需要传递的参数,jason格式
  4. NSDictionary *parameter = @{@"Driverid": @""};
  5.  
  6. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  7. manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  8. [manager POST:urlStr parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
  9. /*文件命名参考代码
  10. // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
  11. // 要解决此问题,
  12. // 可以在上传时使用当前的系统事件作为文件名
  13. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
  14. // 设置时间格式
  15. formatter.dateFormat = @"yyyyMMddHHmmss";
  16. NSString *str = [formatter stringFromDate:[NSDate date]];
  17. NSString *newfileName = [NSString stringWithFormat:@"%@.png", str];
  18. */
  19. for (int i=; i<[imgarray count]; i++) {
  20. [formData appendPartWithFileData:UIImagePNGRepresentation([imgarray objectAtIndex:i]) name:[NSString stringWithFormat:@"file%d",i ] fileName:[NSString stringWithFormat:@"pic%d.png",i] mimeType:@"image/png"];
  21. }
  22. } success:^(AFHTTPRequestOperation *operation, id responseObject) {
  23. if (success) {
  24. //NSLog(@"success\n");
  25. success(responseObject);
  26. }
  27. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  28. if (fail) {
  29. //NSLog(@"fail\n");
  30. fail();
  31. }
  32. }];
  33. }

调用:

  1. //多图片上传
  2. -(void)uploadmutableimg{
  3. NSString *url = @"http://localhost:8888/chepaishibie/uploadimage.php";
  4. UIImage *image1=[UIImage imageNamed:@""];
  5. UIImage *image2=[UIImage imageNamed:@""];
  6. NSMutableArray *imgarray=[[NSMutableArray alloc]init];
  7. [imgarray addObject:image1];
  8. [imgarray addObject:image2];
  9.  
  10. [[ShenAFN sharedInstance] uploadMutableimgWithurl:url imagearray:imgarray success:^(id jsondata) {
  11. NSString *result = [[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding];
  12. NSLog(@"%@", result);
  13. } fail:^{
  14. NSLog(@"请求失败");
  15. }];
  16. }

另外JPEG的图片压缩可以用:

UIImageJPEGRepresentation(image,0.5);

GITHUB:   https://github.com/rayshen/AFNDemo

[iOS AFNetworking框架实现HTTP请求、多文件图片上传下载]的更多相关文章

  1. WebApi2 文件图片上传下载

    Asp.Net Framework webapi2 文件上传与下载 前端界面采用Ajax的方式执行 一.项目结构 1.App_Start配置了跨域访问,以免请求时候因跨域问题不能提交.具体的跨域配置方 ...

  2. SSM框架之中如何进行文件的上传下载

    SSM框架的整合请看我之前的博客:http://www.cnblogs.com/1314wamm/p/6834266.html 现在我们先看如何编写文件的上传下载:你先看你的pom.xml中是否有文件 ...

  3. Spring实现文件的上传下载

    背景:之前一直做的是数据库的增删改查工作,对于文件的上传下载比较排斥,今天研究了下具体的实现,发现其实是很简单.此处不仅要实现单文件的上传,还要实现多文件的上传. 单文件的下载知道了,多文件的下载呢? ...

  4. Retrofit 2.0 轻松实现多文件/图片上传/Json字符串/表单

    如果嫌麻烦直接可以用我封装好的库:Novate: https://github.com/Tamicer/Novate 通过对Retrofit2.0的前两篇的基础入门和案例实践,掌握了怎么样使用Retr ...

  5. JAVAWEB之文件的上传下载

    文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...

  6. 在Window的IIS中创建FTP的Site并用C#进行文件的上传下载

    文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服务器计算机上. 然后,远程计算机可以使用 FTP ...

  7. 创建FTP的Site并用C#进行文件的上传下载

    创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...

  8. linux链接及文件互相上传下载

    若排版紊乱可查看我的个人博客原文地址 基本操作 本篇博客主要介绍如何去链接远程的linux主机及如何实现本地与远程主机之间文件的上传下载操作,下面的linux系统是CentOS6.6 链接远程linu ...

  9. SocketIo+SpringMvc实现文件的上传下载

    SocketIo+SpringMvc实现文件的上传下载 socketIo不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: GIT地址 ...

随机推荐

  1. 数据库Mark.2

    select count(*) as count,DATE_SUB('2016-10-04',INTERVAL regDay DAY) from result_1005 group by DATE_S ...

  2. python 图

    class Graph(object): def __init__(self,*args,**kwargs): self.node_neighbors = {} self.visited = {} d ...

  3. sql server 创建只读帐号

    有时候为了方便查询一下数据,会创建个只读帐号,以免误写sql语句改了数据 步骤:用sa帐号连接后,安全性--登录名--新建 输入要新建的帐号密码,在服务器角色里面单勾一个public 在 用户映射里面 ...

  4. 快速备份和还原 MySQL 数据库的另一种方法

    一直使用 SQL Server 作为公司产品的数据库来存储系统数据,所以备份还原一直都不是问题,因为 SQL Server 的备份还原非常迅速和易用.但今年公司改变策略,使用起 MySQL 数据库作为 ...

  5. <实训|第十二天>用LVM对linux分区进行动态扩容

    [root@localhost~]#序言在linux中,我们安装软件的途径一般有那些,你们知道吗?在linux中,如果你的磁盘空间不够用了,你知道如何来扩展磁盘吗?动态扩容不仅在工作中还是在其他方面都 ...

  6. js的Array的map和sort实现方法

    Array.prototype.mapA = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fu ...

  7. NLPIR分词工具的使用(java环境下)

    一.NLPIR是什么? NLPIR(汉语分词系统)由中科大张华平博士团队开发,主要功能包括:中文分词,词性标注,命名实体识别,用户词典功能,详情见官网:http://ictclas.nlpir.org ...

  8. 判断移动端js代码

    var ua=navigator.userAgent.toLowerCase(); var contains=function (a, b){ if(a.indexOf(b)!=-1){return ...

  9. scrollLeft的相关问题(js横向无缝滚动)

    <div id="demo"> <div id="innerdemo"> <div id="demo1"> ...

  10. 【Alpha版本】项目测试

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬 ...