文档章节

IOS--图片上传

求是科技
 求是科技
发布于 2015/03/06 14:37
字数 1624
阅读 205
收藏 0

ASIFormDataRequest是ASIHttpRequest类库的重要组成部分,本文就采用ASIFormDataRequest以POST方式实现图片上传。

首先,要上传图片并不是直接将图片通过URL上传的,而是要把图片转换为二进制文件。

IOS中有两个方法能直接将图片转换为二进制

UIImage *image = [UIImage imageNamed:@"xx.png"];
NSData *data = UIImagePNGRepresentation(image);
NSData *data2 = UIImageJPEGRepresentation(image,1);

就是采用如上两种方法中的一个将一个图片转换为二进制数据data,然后再将data数据上传到网络上。在这里使用一个网络请求三方库ASIFormDataRequest。

具体代码如下:

//用URL初始化请求
ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];
//设置代理
[request setDelegate:self];
//为上传对象添加数据
//上传后保存的名字、保存类型、表单名
[request addData:dataWithFileName:@"xx.png" andContentType:@"image/png" forKey:@"file"];
//开始,异步
[request startAsynchronous];

如上就完成了图片的上传。

//剩下部分就是服务器端的事情

………………………………



方法二:

1>IOS上传图片代码

NSString *fileName = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"jpg"];
NSString *url = @"http://……/upload.aspx"; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[request setPostValue:@"MyName" forkey:@"name"];
[request setFile:filename forkey:@"this_file"];
[request buildRequestHeaders];
NSLog(@"header:%@",request.requestHeaders);
[request startSynchronous];
NSLog(@"responseString = %@",request.requestHeaders);

2>服务器接收处理图片代码

public partial class upload : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        HttpFileCollection MyFilecollection = Request.Files;
        MyFilecollection[0].SaveAs(Server.MapPath("~/ImageStore/" + MyFilecollection[0].FileName));
    }
}

服务器端代码采用C++编写。

方法三:

IOS通过http post上传图片、文件等

在http网络请求中,post请求没有长度的限制(因为post将数据放在body中),get是放在浏览器的地址栏中。

POST有两种方式:

1>直接将数据放在body中,用contentType来区分类型是text还是json或者别的类型,这种最简单。

2>表单的形式,通过boundary来区分放置的是哪些数据,就像一个字典,用K、V放置对象。

通过我们使用ASIHttp的第三方库里面的ASIFormDataRequest来模拟Form表单提交,提交格式Header会自动识别。

下面对比下ASIHttp与传统POST的不同之处

NSMutableURLRequest传统post用法

……这里不介绍,自行百度。

下面介绍ASIHttp方法

NSURL *url = [NSURL URLWithString:@"请求地址"];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"值1" forkey:@"参数1"];
[request setPostValue:@"值2" forkey:@"参数2"];
[request start];
NSError *error = [request error];
if(!error)
{
    NSString *response = [request responseString];
    NSLog("%@",response);
}



IOS摄像头/本地相册获取图片,压缩图片,上传至服务器

iphone中,图片通常存储在4个地方(相册、应用程序包、沙盒、Internet),通过这4个源,我们就可以存储应用图片。

1>相册

用户可以通过UIImagePickerController类提供的交互对话框来从相册中选择图片。但是,相册中的图片机器路径无法直接从应用程序访问,只能通过终端用户去选择和使用相册图片。

2>应用程序包

应用程序包可能会将图像与可执行程序、Info.plist文件和其他资源一同存储。我们可以通过本地文件路径来读取这些图像并在应用程序中显示它们。

3>沙盒

借助沙盒,我们可以将图片存储到Documents、Library、tmp文件夹中。这些文件均可被应用程序读取。

4>Internet

应用程序可以通过图片的URL来访问Internet上的资源。

如上是一些小知识,来自《iphone开发秘籍(第二版)》,想了解更多,自主去查阅此书。

正题部分,从摄像头/相册获取图片、压缩图片、上传图片

1>从摄像头/相册中获取图片

由用户浏览相册并选择图片给程序使用,在这里,我们需要使用UIImagePickerController类来和用户交互。使用UIImagePickerController类和用户交互,必须要实现如下2个协议。从相册获取图片,代码如下:

  - (void)pickImageFromAlbum
  {
  imagePicker = [[UIImagePickerController alloc] init];
  imagePicker.delegate = self;
  imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
  imagePicker.allowsEditing = YES;
  [self presentModalViewController:imagePicker animated:YES];
  }

如上代码解释

首先实例化UIImagePickerController对象,接着设置代理。设置图片来源为UIImagePickerControllerSourceTypePhotoLibrary ,表明当前图片的来源为相册。

从摄像头获取图片,代码如下:

  - (void)pickImageFromCamera
  {
  imagePicker = [[UIImagePickerController alloc] init];
  imagePicker.delegate = self;
  imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
  imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
  imagePicker.allowsEditing = YES;
  [self presentModalViewController:imagePicker animated:YES];
  }

以上代码为从摄像头获取图片,和从相册获取图片只是图片的来源位置不一样,摄像头图片的来源为UIImagePickerControllerSourceTypeCamera 。

接着是用户操作时间,用户选择好图片后,就会 回调 选择结束的方法,代码如下:

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
  {
  UIImage *image= [info objectForKey:@"UIImagePickerControllerOriginalImage"];
  if (picker.sourceType == UIImagePickerControllerSourceTypeCamera)
  {
  // UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
  }
  theImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(120.0, 120.0)];
  UIImage *midImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(210.0, 210.0)];
  UIImage *bigImage = [UtilMethod imageWithImageSimple:image scaledToSize:CGSizeMake(440.0, 440.0)];
  [theImage retain];
  [self saveImage:theImage WithName:@"salesImageSmall.jpg"];
  [self saveImage:midImage WithName:@"salesImageMid.jpg"];
  [self saveImage:bigImage WithName:@"salesImageBig.jpg"];
  [self dismissModalViewControllerAnimated:YES];
  [self refreshData];
  [picker release];
  }

在回调方法中,需要对图片进行大小处理,为图片的上传做准备,如上代码就是对图片进行缩放,缩放代码比较简单,不做解释。

接着对图片进行压缩处理,代码如下:

  + (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
  {
  // Create a graphics image context
  UIGraphicsBeginImageContext(newSize);
  // Tell the old image to draw in this new context, with the desired
  // new size
  [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
  // Get the new image from the context
  UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  // End the context
  UIGraphicsEndImageContext();
  // Return the new image.
  return newImage;
  }

接着是存储图片

通过之前的小知识了解,将应用程序所需要的一些图片存入沙盒是个不错的选择,而且应用程序可以直接通过路径去访问沙盒中的图片,本例就将图片存入沙盒中的Documents目录下,代码如下

- (void)saveImage:(UIImage *)tempImage WithName:(NSString *)imageName

{

    NSData* imageData = UIImagePNGRepresentation(tempImage);

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString* documentsDirectory = [paths objectAtIndex:0];

    // Now we get the full path to the file

    NSString* fullPathToFile = [documentsDirectory stringByAppendingPathComponent:imageName];

    //and then we write it out

    [imageData writeToFile:fullPathToFile atomically:NO];

}

接下来是从Documents目录下获取图片,要想从Documents下获取图片,首先要获得Documents目录的路径。代码如下:

- (NSString *)documentFolderPath

{

    return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

}

然后我们可以通过文件名,去访问获取资源了。

最后一步就是上传图片,这里使用的是ASIFormHttpRequest开源框架,代码如下:

  - (void)upLoadSalesBigImage:(NSString *)bigImage MidImage:(NSString *)midImage SmallImage:(NSString *)smallImage

{

    NSURL *url = [NSURL URLWithString:UPLOAD_SERVER_URL];

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

    [request setPostValue:@"photo" forKey:@"type"];

    [request setFile:bigImage forKey:@"file_pic_big"];

    [request buildPostBody];

    [request setDelegate:self];

    [request setTimeOutSeconds:TIME_OUT_SECONDS];

    [request startAsynchronous];

}

如下就是实际的例子,在UIWebView中调用IOS相册,并选择图片上传到Linux Web服务器上。

//http://blog.sina.com.cn/s/blog_5fb39f910101ajua.html#

© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 89
博文 453
码字总数 228281
作品 0
成都
后端工程师
PHP POST接收处理 IOS上传NSData图片数据,上传图片到服务器

【IOS 接收PHP 图片】 1,PHP将图片的URL直接返回给IOS端即可,IOS获取到URL处理,下载缓存就可以在APP端使用了。 【IOS上传图片PHP接收】 1、IOS上传图片可能有很多方法,今天作者我用了这种...

RablePHP
2014/11/28
0
3
Reveal4断点加载-官网拉下来的找起来方便

通过Xcode断点加载Reveal Server 下面描述的方法仅适用于在iOS或tvOS模拟器中运行的应用程序。 通过Xcode调试器断点加载Reveal Server框架是一种很好的方式,可以让您内省您正在处理的任何项...

iOS_windKing
07/17
0
0
iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

iOS精选源码 iOS 精美过度动画源码(http://www.code4app.com/thread-14827-1-1.html) iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路(http://www.code4app.com/thread-30348-1-1.htm...

sunnyaigd
07/11
0
0
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码

iOS精选源码 快速创建menuItem控件 YHPhotoBrowser 优化的网络图片浏览 cocoaAsynSocket demo (包含客户端和服务端) SwipeMenuViewController现在支持iPhoneX和Swift4。 仿微信的提醒对话框 ...

sunnyaigd
2017/10/31
0
0
移动应用微信图像接口开发指南 (iOS版)

使用说明 本文档主要介绍微信图像SDK(iOS版)使用方法,利用SDK可以准确搜索到用户上传的图像。 本文属于入门级文档,旨在帮助开发者快速学习iOS SDK的使用并应用到自身开发工作。具体 API ...

雪深
2015/05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

流量劫持是如何产生的?

流量劫持,这种古老的攻击沉寂了一段时间后,最近又开始闹的沸沸扬扬。众多知名品牌的路由器相继爆出存在安全漏洞,引来国内媒体纷纷报道。只要用户没改默认密码,打开一个网页甚至帖子,路由...

谢思华
24分钟前
0
0
Hadoop Client无法使用maven下载源码

最近在学习hadoop,使用maven的时候想看一下源码的注释,结果IDEA一直提示无法下载 搞得我一度以为maven坏掉了。 但是通过搜索,发现在maven仓库里确实没有源码.... 而2.8.1以及之前的版本是...

Iceberg_XTY
26分钟前
0
0
为什么程序员千万不要重写代码?

你所做的事情,也许暂时看不到成果,但不要灰心或焦虑,你不是没有成长,而是在扎根。 图片来自网络 0 前言 程序员都有一颗工程师的心,所以当他们到一片新的场地想做的第一件事就是,将旧的...

Java小铺
27分钟前
0
0
VUE集成AdminLte

1. 安装需要到插件 npm i admin-lte -Snpm i jquery -Snpm i axios -Snpm i vue-router -S 2. 配置webpack.config.js 2.1 module.exports.module.rules修改字体loader: {test: /\.(p......

Pasenger
今天
0
0
Spring Aop原理之切点表达式解析

在前面的文章(Spring AOP切点表达式详解)中,我们总结了Spring Aop切点表达式的用法,而在上文(Spring Aop原理之Advisor过滤)中我们讲到,切点表达式的解析主要是在PatternParser.parse...

爱宝贝丶
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部