ios通过post上传文件

由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。

上传图片的http post请求的格式是这样的:

Java代码  

  1. Content-type: multipart/form-data, boundary=AaB03x
  2. --AaB03x
  3. content-disposition: form-data; name="field1"
  4. Hello Boris!
  5. --AaB03x
  6. content-disposition: form-data; name="pic"; filename="boris.png"
  7. Content-Type: image/png
  8. ... contents of boris.png ...
  9. --AaB03x--

第一行是指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。

boundary=AaB03x说明了AaB03x为分界线。比如 --AaB03x 就是一个分界线的意思

content-disposition: form-data; name="field1"

Hello Boris!

这句话声明了请求中的一个字段的名称,如field1  以及字段的值,如Hello Boris!

这里类似form表单中的<input name="field1" type="text" value="Hello Boris!"/>

中间的空行是必须的。

不同的字段之间用分界线分开,分界线需要单独一行,如 --AaB03x--

分界线的下一行,是下一个字段

content-disposition: form-data; name="pic"; filename="boris.png"

Content-Type: image/png

... contents of boris.png ...

--AaB03x--

这里声明了变量pic,也就是我们要传的文件,上传文件的时候需要在后边指定file name:filename="boris.png"

并且需要在下一行指定文件的格式:Content-Type: image/png

... contents of boris.png ...  这里是boris.png的二进制内容,如 <89504e47 0d0a1a0a 0000000d 49484452 000000b4 000000b4 08020000 00b2af91 65000020 00494441 5478012c
dd79b724 6b7616f6 8c888c88 8c9c8733 55ddb1d5 6a0db486 06218401 ......

在http post请求的结尾,需要有一个分界线,但是是前后都有--的:--AaB03x--

以上的这些格式,是http的规范,每个空行,空格都是必须的。

下边是iOS的实现代码:

#define HTTP_CONTENT_BOUNDARY @"WANPUSH"
-(BOOL)httpPutData:(NSString*)strUrl FilePath:(NSString*)filePath DataType:(NSString*)dataType {
    strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL* url = [NSURL URLWithString:strUrl];
    
    NSData* data = [NSData dataWithContentsOfFile:filePath];
    NSString* fileName = [filePath lastPathComponent];
    
    NSString* strBodyBegin = [NSString stringWithFormat:@"--%@\nContent-Disposition: form-data; name=\"%@\"; filename=\"%@\"\nContent-Type: %@\n\n", HTTP_CONTENT_BOUNDARY, @"file",  fileName, dataType];
    NSString* strBodyEnd = [NSString stringWithFormat:@"\n--%@--",HTTP_CONTENT_BOUNDARY];
    
    NSMutableData *httpBody = [NSMutableData data];
    [httpBody appendData:[strBodyBegin dataUsingEncoding:NSUTF8StringEncoding]];
    [httpBody appendData:data];
    [httpBody appendData:[strBodyEnd dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSMutableURLRequest* httpPutRequest = [[NSMutableURLRequest alloc] init];
    [httpPutRequest setURL:url];
    [httpPutRequest setHTTPMethod:@"POST"];
    [httpPutRequest setTimeoutInterval: 60000];
    [httpPutRequest setValue:[NSString stringWithFormat:@"%@", @(httpBody.length)] forHTTPHeaderField:@"Content-Length"];
    [httpPutRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",HTTP_CONTENT_BOUNDARY] forHTTPHeaderField:@"Content-Type"];
    httpPutRequest.HTTPBody = httpBody;
    
    NSHTTPURLResponse* httpResponse = nil;
    NSError *error = [[NSError alloc] init];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&httpResponse error:&error];
    if (httpResponse == nil) {
        NSLog(@"url: %@\nerror_code: %@", strUrl, error);
        return NO;
    }
    if (httpResponse.statusCode != 200) {
        NSLog(@"url: %@\nHTTP response: %ld", strUrl, (long)httpResponse.statusCode);
        return NO;
    }
    
    return YES;
}

后台php代码:

<?php
    $target_path  = "./tmp/";//
    $target_path = $target_path.($_FILES['file']['name']);
    $target_path = iconv("UTF-8","gb2312", $target_path);
    if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
       echo "The file ".( $_FILES['file']['name'])." has been uploaded.";
    }else{
       echo "There was an error uploading the file, please try again! Error Code: ".$_FILES['file']['name'];
    }
?>
时间: 2024-08-10 22:52:17

ios通过post上传文件的相关文章

iOS application/json上传文件等

在和sever后台交互的过程中.有时候.他们需要我们iOS开发者以"application/json"形式上传. NSString *accessUrl = [NSString stringWithFormat:@"%@/xxx",@"https://www.xxxxx.com:xxxx"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URL

iOS 网络请求 NSURLSession 的上传文件方法

NSURLSession/NSURLConnection的上传文件方法 此篇文章的理论基础主要是与HTTP网络通信协议相关.为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构.HTTP完整的原理内容就此略过.在此只略提相关内容.文中涉及的设计源码可以通过这里获取 https://github.com/wuqingjian2015/uploadHelper,有意者可以去看看. HTTP是干什么用的呢? 先考虑一下以下应用过程: 从客户端向服务器端发起一个请求

PHP -- 上传文件接口编写 及 iOS -- 端上传图片AF实现

PHP 上传文件接口: //保存图片 $json_result ['status'] = 0; $path = 'upfile'; $json_result ['status'] = 0; $json_result ['successmsg'] = '上传失败'; if (isset ( $_FILES ['image'] )) { $upfile = 'upfile/' . $_FILES ['image'] ['name']; if (! @file_exists ( $path )) {

iOS上传文件,有关http上传协议-RFC1867

以上是抓包HTML input file标签上传的内容 只要模拟上面http 的header跟body就可以成功. 整体说明: post 上传文件时,以在http body里面带参数,参数的格式,根据RFC1867协议要求写成如下 在http header 里面定义 boundary ,boundary的值为body里面分隔参数的标志. Content-Type: multipart/form-data; boundary=----------LlcUploadTaskWithRequest 假

iOS wifi上传文件

利用Wi-Fi从pc端上传文件到iOS设备上 首先,从Github下载cocoa-web-resource: pc浏览器运行的效果: 代码中如果不想端口为大家所熟知的,可以随机生产一个端口号,在代码的操作很简单,只要在CocoaWebResourceViewController.m文件中注释[httpServer setPort:8080];这一行代码,以后开启server就是一个随机的端口号. cocoa-web-resource能进行上传各种文件,美中不足的是当上传一个大一点的文件,在pc的

iOS开发——网络Swift篇&amp;NSURLSession加载数据、下载、上传文件

NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的sharedSession()和dataTaskWithRequest方法创建. 1 func sessionLoadData(){ 2 //创建NSURL对象 3 let urlString:String="http://hangge.com" 4 var url:NSURL! = NSURL(

[iOS 多线程 &amp; 网络 - 2.11] - ASI框架上传文件

A.ASI的上传功能基本使用 1.实现步骤 (1)创建请求 使用ASIFormDataRequest (2)设置上传文件路径 (3)发送请求 2.上传相册相片 UIImagePickerController用来选择图片 设置图片来源,可以选择相册 使用代理 UIImagePickerControllerDelegate方法,选择完成之后取得相片 1 // 2 // ViewController.m 3 // ASIUploadDemo 4 // 5 // Created by hellovoid

IOS开发教程之put上传文件的服务器的配置及实例分享-备用

感谢大神分享 1,HTTP常见的方法 GET 获取指定资源 POST 2M 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源 HEAD 获取指定资源头部信息PUT 替换指定资源(不支持浏览器操作)DELETE 删除指定资源 2,配置服务器的put请求方式: 复制代码代码如下: 1> n 打开终端p cd /etc/apache2p sudo vim httpd.conf n 在vim中输入p /httpd-dav.conf• 查找httpd-dav.confp 按0将光标移动至

腾讯对象存储服务COS加密签名上传文件与下载文件的剖析,福利提供给所有使用Android的小伙伴们!

在做一些用户需求的时候,公司往往需要工程师采集到更多有用的关于用户的个人信息,然后对用户群进行分析,今天我不是来分析这些的,今天我主要是说 腾讯推出的款云产品,那就是对象存储服务COS,这个产品面向所有开发者,新用户都有免费享有10G的使用权,10G可能对于做方案的工程师来说可能是微不 足道的,比如后视镜和车载方案,会常常需要用到视频的存储与云分享,当然这里不是只本地存储哦,我指的是用户在使用方案商的方案的时候,比如他开车 的时候录了一段视频需要分享到某个域,共享给大家看,比如微信,这时候他肯定