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

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

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

#pragma mark - JSON方式post提交数据
- (void)postJSONWithUrl:(NSString *)urlStr parameters:(id)parameters success:(void (^)(id responseObject))success fail:(void (^)())fail
{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    // 设置请求格式
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    // 设置返回格式
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:urlStr parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
        //查看返回数据
        //NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        if (success) {
            success(responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"%@", error);
        if (fail) {
            fail();
        }
    }];
}

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

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

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

首先看下浏览器端的上传实现: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后台代码如下:

<?
    header("Content-type: text/html; charset=UTF-8");
    include("../configmysql.php");
    mysql_select_db("chepaiDB",$q); //数据库  

    //POST获取键值对参数
    $TEMPid=$_POST[‘Driverid‘];
    echo "\nDriverid is ".$TEMPid."\n";

    foreach ($_FILES as $_eachFile) {
        //file文件处理
        if ($_eachFile["error"] > 0)
          {
          echo "错误: " . $_eachFile["error"] . "\n";
          }
        else
          {
          echo "文件名: " . $_eachFile["name"] . "\n";
          echo "类型: " . $_eachFile["type"] . "\n";
          echo "大小: " . ($_eachFile["size"] / 1024) . " Kb\n";
          }
         if (file_exists("uploadimage/" . $_eachFile["name"]))
            {
              echo $_eachFile["name"] . " 文件已经存在. ";
            }
        else
            {
              move_uploaded_file($_eachFile["tmp_name"],
              "uploadimage/" . $_eachFile["name"]);
              echo "文件已经被存储到: " . "uploadimage/" . $_eachFile["name"]."\n";
            }
    }
    /*
    //file文件处理
    if ($_FILES["file"]["error"] > 0)
      {
      echo "错误: " . $_FILES["file"]["error"] . "\n";
      }
    else
      {
      echo "文件名: " . $_FILES["file"]["name"] . "\n";
      echo "类型: " . $_FILES["file"]["type"] . "\n";
      echo "大小: " . ($_FILES["file"]["size"] / 1024) . " Kb\n";
      }
     if (file_exists("uploadimage/" . $_FILES["file"]["name"]))
        {
          echo $_FILES["file"]["name"] . " 文件已经存在. ";
        }
    else
        {
          move_uploaded_file($_FILES["file"]["tmp_name"],
          "uploadimage/" . $_FILES["file"]["name"]);
          echo "文件已经被存储到: " . "uploadimage/" . $_FILES["file"]["name"]."\n";
        }
    */
?>

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

单图上传:

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

调用:

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

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

- (void)uploadMutableimgWithurl:(NSString *)urlStr imagearray:(NSMutableArray *)imgarray success:(void (^)(id responseObject))success fail:(void (^)())fail
{
    //需要传递的参数,jason格式
    NSDictionary *parameter = @{@"Driverid": @"10000"};

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:urlStr parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        /*文件命名参考代码
         // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名
         // 要解决此问题,
         // 可以在上传时使用当前的系统事件作为文件名
         NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
         // 设置时间格式
         formatter.dateFormat = @"yyyyMMddHHmmss";
         NSString *str = [formatter stringFromDate:[NSDate date]];
         NSString *newfileName = [NSString stringWithFormat:@"%@.png", str];
         */
        for (int i=0; i<[imgarray count]; i++) {
            [formData appendPartWithFileData:UIImagePNGRepresentation([imgarray objectAtIndex:i]) name:[NSString stringWithFormat:@"file%d",i ] fileName:[NSString stringWithFormat:@"pic%d.png",i] mimeType:@"image/png"];
        }
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (success) {
            //NSLog(@"success\n");
            success(responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (fail) {
            //NSLog(@"fail\n");
            fail();
        }
    }];
}

调用:

//多图片上传
-(void)uploadmutableimg{
    NSString *url = @"http://localhost:8888/chepaishibie/uploadimage.php";
    UIImage *image1=[UIImage imageNamed:@"0"];
    UIImage *image2=[UIImage imageNamed:@"1"];
    NSMutableArray *imgarray=[[NSMutableArray alloc]init];
    [imgarray addObject:image1];
    [imgarray addObject:image2];

    [[ShenAFN sharedInstance] uploadMutableimgWithurl:url imagearray:imgarray success:^(id jsondata) {
        NSString *result = [[NSString alloc] initWithData:jsondata encoding:NSUTF8StringEncoding];
        NSLog(@"%@", result);
    } fail:^{
        NSLog(@"请求失败");
    }];
}

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

UIImageJPEGRepresentation(image,0.5);

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

时间: 2024-10-26 18:13:49

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

WebApi2 文件图片上传下载

Asp.Net Framework webapi2 文件上传与下载 前端界面采用Ajax的方式执行 一.项目结构 1.App_Start配置了跨域访问,以免请求时候因跨域问题不能提交.具体的跨域配置方式如下,了解的朋友请自行略过. 跨域配置:NewGet安装dll Microsofg.AspNet.Cors 然后在App_Start 文件夹下的WebApiConfig.cs中写入跨域配置代码. 1 public static class WebApiConfig 2 { 3 public sta

asp.net文件的上传下载

Web.Config 配置文件 <?xml version="1.0"?> <configuration> <appSettings>    <add key="FileUploadPath" value="Upload/" />    <add key="FileTypeLimit" value=".zip,.rar,.dox,.ppt,.txt,.mp3&qu

JAVAWEB之文件的上传下载

文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将他们表达出来.下面是具体的步骤,大家可以跟着我一步一步的用apache的fileupload插件来完成文件的上传下载. 1.创建一个web工程,我们这里取名为fileupload 2.导入相关jar包,,数据源使用的是apache-c3p0数据源,以及上传下载插件包,goson库,以及mysql驱动

HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

Asp.net实现MVC处理文件的上传下载功能实例教程

这篇文章主要介绍了Asp.net实现MVC处理文件的上传下载功能,比较全面而系统的对Asp.net MVC的文件上传下载功能进行了深入分析,有很好的借鉴价值,需要的朋友可以参考下 上传于下载功能是程序设计中非常常见的一个功能,在ASP.NET程序开发中有着非常广泛的应用.本文就以实例形式来实现这一功能. 一.概述 如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUploa

使用Kindeditor的多文件(图片)上传时出现上传失败的解决办法/使用Flash上传多文件(图片)上传时上传失败的解决办法

近来用户反映希望我们把在线编辑器中的多图片上传功能实现,因为他们在编辑商品描述时经常会有一次上传多张图片的需求,如果要逐张选择的话效率很低,客户的需求就是我们的追求,很快我们就把完善功能排到了日程表中,要求尽快实现. 我们在项目中使用的在线编辑器是Kindeditor4.1.10,它们的多文件上传插件是使用Flash实现的,原本应该就是能使用的,但为什么老是显示上传失败的,百度了一下前人的经验和教训,出现这种情况,有两种可能:1)上传的目标文件夹没有写权限,导致上传的文件无法进行写操作,所以上传

通过scp实现文件的上传下载

一.什么是scp? Scp 是SSH自带的一个内置命令,是安全拷贝的意思,可以实现文件的上传和下载,传输速率快,    安全性高. 二.通过scp实现文件的上传下载 1.  从服务器下载文件到本地 (1)不指定身份下载 例:下载服务器172.25.254.116的/home/student/test/QQ/12.txt到本地/home/kiosk/ 不指定身份下载默认以当前登陆用户下载,如果当前登陆用户对下载文件没有读写权限将不能下载 (2)指定身份下载 例:以root身份下载服务器172.25

WebUploader文件图片上传插件的使用

最近在项目中用到了百度的文件图片上传插件WebUploader.分享给大家 需要在http://fex.baidu.com/webuploader/download.html点击打开链接下载WebUploader /*图片上传 */ var $ = jQuery, $img=$("#imagePath_img"), // 优化retina, 在retina下这个值是2 ratio = window.devicePixelRatio || 1, // 缩略图大小 thumbnailWid

文件的上传下载

文件的上传下载包括文件的上传和文件的下载两部分,下面以项目的形式给出,项目的结构如下图所示: 项目的思路如下: 1.启动项目,输入地址:http://localhost:8080/fileUpload/upload/upload.jsp,进入文件上传界面upload.jsp. 2.文件上传的路径是UploadHandleServlet,创建临时保存文件路径(在项目的根目录的web-inf下面):                                   D:\ruanjian\tomc