文档章节

IOS--图片上传

求是科技
 求是科技
发布于 2015/03/06 14:37
字数 1624
阅读 200
收藏 0
点赞 0
评论 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
成都
后端工程师
iOS 线上版本图片资源格式的问题导致的闪退

近段刚刚上传了app新版本 ,上线前也是各种真机调试,包括公司一位同事的iOS9.2系统的iPhone6s , 一点问题都没有 可是两天后审核通过了 我们公司其他人下载app都非常流畅 ,也没有闪退的情况...

奥卡姆剃须刀 ⋅ 2017/05/01 ⋅ 0

关于“发送原图”功能问题的记录

本文主要记录一个bug从发现、定位到延期解决的过程。文末添加了已踩过的坑 近期在做“发送原图”功能的时候,遇到一个bug:在Android、Windows、Mac 客户端发送原图,iOS客户端接收,保存原图...

si1ence ⋅ 2017/12/14 ⋅ 0

iOS高仿微信、仪表盘、图片标注图片滤镜、高斯模糊、上拉加载、下拉刷新等源码

iOS精选源码 Swift-图片画框标注(http://www.code4app.com/thread-29884-1-1.html) Swift版的上拉加载, 下拉刷新控件(一句话集成, 超级易用)(http://www.code4app.com/thread-29885-1-1.html...

sunnyaigd ⋅ 05/22 ⋅ 0

Appuploader的安装介绍

注意:下载AU后需安装java8运行环境才能启动;安装好了最新Java8运行环境,解压AU软件包,无需安装,Windows 64位系统点击appuploader.exe启动;如果是Linux/Windows 32位系统或Mac系统双击appuplo...

webmirror ⋅ 05/11 ⋅ 0

iOS源码补完计划--AFNetworking 3.1.0源码研读

参拜一下AFNetworking的源码。 第四篇源码、暂时来看也是iOS方向的最后一篇、撸完准备趁着热乎撸一撸网络协议。 目录 准备工作 功能模块 AFURLSessionManager/AFHTTPSessionManager AFNetwo...

kirito_song ⋅ 05/25 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

Unity与IOS交互,调用IOS系统相机和相册

前面两篇总结了一下unity与android的简单交互和调用安卓系统相机和相册,比较蛋疼的是,后来发现不同的测试机上会有不同的bug。。。下阶段要一个一个的解决一下 今天总结一下与IOS的交互。这...

qq_32587659 ⋅ 05/16 ⋅ 0

iOS基础深入补完计划--NSURLSession使用详解(附Demo)

目录 前言 API Demo 前言 本文主要是把NSURLSession以及NSURLSessionTask相关的代理方法全部整理了一下。 旨在大体了解在一个iOS网络请求中、一个任务究竟经理了什么。 而我们、又能做些什么...

kirito_song ⋅ 05/10 ⋅ 0

UISegmentedControl segmentedControl

一、简介 <UIControl-->UIView-->UIResponder-->NSObject 格式为 1-->初始化(作用) typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) { UIDataDetector......

无邪8 ⋅ 05/22 ⋅ 0

iOS新特性框架、仿微信图片浏览、视频监控、爱心动画、文字适配等源码

iOS精选源码 iOS一个看电影、电视剧集合 HDCinema(http://www.code4app.com/thread-29425-1-1.html) 一个非常简易的新特性集成框架NewFeatures(http://www.code4app.com/thread-29433-1-1.ht......

sunnyaigd ⋅ 05/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring Email

使用spring发Email其实就是使用spring自己封装携带的一个javamail.JavaMailSenderImpl类而已。这个类可以当一个普通的java对象来使用,也可以通过把它配置变成spring Bean的方式然后注入使用...

BobwithB ⋅ 26分钟前 ⋅ 0

spark 整理的一些知识

Spark 知识点 请描述spark RDD原理与特征? RDD全称是resilient distributed dataset(具有弹性的分布式数据集)。一个RDD仅仅是一个分布式的元素集合。在Spark中,所有工作都表示为创建新的...

tuoleisi77 ⋅ 29分钟前 ⋅ 0

思考

时间一天天过感觉自己有在成长吗?最怕的是时光匆匆而过,自己没有收获!下面总结下最近自己的思考。 认识自己 认识另一个自己,人们常说要虚心听取别人意见和建议。然而人往往是很难做到的,...

hello_hp ⋅ 30分钟前 ⋅ 0

IT行业的变革就像世界杯德国对战墨西哥一样难以预测[图]

最近在观看世界杯,尤其是昨天的比赛,上一届卫冕冠军德国队居然0:1告负墨西哥,这创造了历史,首先是墨西哥从来没赢过德国队,其次是德国队36年来首站没输过,再差也是打平,而这次,德国队...

原创小博客 ⋅ 49分钟前 ⋅ 0

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 59分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部