简单的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": @""};
//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": @""};
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": @""}; 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=; 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:@""];
UIImage *image2=[UIImage imageNamed:@""];
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

[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. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35

    T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...

  2. Ros学习注意点

    编译问题 回调函数不能有返回类型,严格按照实例程序编写 第三方库的问题,packet.xml里面必须加上自己的依赖文件 之前文档里面介绍的有点问题. 主要表现在:当你建立包的时候就写入了依赖,那就不需 ...

  3. XStream、JAXB 日期(Date)、数字(Number)格式化输出xml

    XStream.Jaxb是java中用于对象xml序列化/反序列化 的经典开源项目,利用它们将对象转换成xml时,经常会遇到日期(Date).数字按指定格式输出的需求,下面是使用示例: 一.日期字段格 ...

  4. C#执行Javascript代码的几种方法

    一.开源项目 Javascript .NET 地址: http://javascriptdotnet.codeplex.com/ 它是Google Chrome V8引擎在.NET上的封装,功能完善, ...

  5. 在线文档预览方案-office web apps

    最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...

  6. Qt Creator 常用快捷键

    多行注释模式                                                                                            Ct ...

  7. 我的微型工作流引擎-功能解析及API设计

    一.前言 上一篇我给大家介绍了我的工作流的模型和基本的设计,这篇我想详细说明下我这款工作流的功能及使用示例.这款工作流主要是面向开发者设计的,为了先让大家有个全局的认识,局部功能的设计实现就不细说了, ...

  8. 3到6年的.NETer应该掌握哪些知识?

    我们组的开发人力一直比较紧张,今年春节后,高层终于给了几个headcount,我们可以开始招人了.从三月初我们就开始找简历,渠道有拉钩,内推,我司自己的招聘网站和智联等.简历筛了很多,也打了很多电话, ...

  9. 如何限制虚拟主机可使用的CPU资源

    使用IIS 6.0运营虚拟主机的朋友们都会碰到这样一个问题,当某个网站占用大量CPU资源时,会把整个服务器都拖慢了,影响服务器上其他网站的访问速度,客户们的投诉也让系统管理员倍感头疼.我们知道,从II ...

  10. 简单Ztree的实现————不连接数据库版

    Ztree可以去官网去下载相应的版本和API,我这里就简单的介绍下它的实现以及因为Ztree的小例子印发的Js问题,稍后我会在博客中写JS的异步问题, 我这里用的是MVC4.0,好了正文开始,上代码 ...