POST请求上传多张图片并携带参数

POST请求上传多张图片并携带参数

在iOS中,用POST请求携带参数上传图片是非常恶心的事情,HTTPBody部分完全需要我们自己来配置,这个HTTPBody分为3个部分,头部分可以携带参数,中间部分就是我们要传输的图片文件,尾部就是结束标识了,这些设置完了还不够,你还需要配置一下HTTPHeaderField中的Content-Length以及Content-Type,恐怕一般人都会头大:).

完整的HTTPBody解密出来后是下面的格式:

--AaB03x
Content-Disposition: form-data; name="appkey"

peixunduoduo
--AaB03x
Content-Disposition: form-data; name="content"

真心太好用了!
--AaB03x
Content-Disposition: form-data; name="userid"
--AaB03x
Content-Disposition: form-data; name="sumscore"
--AaB03x
Content-Disposition: form-data; name="courseid"
--AaB03x
Content-Disposition: form-data; name="fromapp"
--AaB03x
Content-Disposition: form-data; name="sign"

003a0d94aff1c7728ab21eb785fbd544
--AaB03x
Content-Disposition: form-data; name="timestamp"

--AaB03x
Content-Disposition: form-data; name="image1"; filename="1.png"
Content-Type: image/png

<89504e47 0d0a1a0a 0000000d 49484452 000000c9 000000b9 08060000 0082e41b c4000000 1c69444f 54000000 02000000 00000000 5d000000 28000000 5d000000 5c000030 914514f9 44000030 5d494441 547801ec 7d0b7015 55ba2eea 8ce7a8e3 191d9ff8 0221ec50 35a335b7 4a92ec47 928d2373 4818e7e8 301254d4 0113f50e 09e21c08 1ec34b04 026a8023 210e11a3 189084b9 046a02c5 4b86644c 8e922a42 098c12ca 70490e82 6e2f8178 cd78bb4b 27c7f7fb 0d924e76 26c49c01 ecfdd078 fa059f2f fe098124 c4385d62 1c5f0c75 2dde0f81 e42a8384 8db86b91 b1aea53e 85401202 4908a401 78200492 0003d4d3 12d1a949 44a83850 ba00f69b ed439299 be63b7a7 db792dd1 e7310e14 b2d7fbfb ff017ed5 ee545a48 12fc0000 00004945 4e44ae42 6082>

--AaB03x--

本人封装好了上传图片的类,源码如下:

NETWorkPicUpload.h

//
//  NETWorkPicUpload.h
//  UploadPics
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

// 创建pictures数组需要的数据
NSData * createPNGPicture(NSString *formBoundary, UIImage *image,
                          NSString *name,         NSString *filename);

@interface NETWorkPicUpload : NSObject

@property (nonatomic, strong) NSString       *boundary;    // 分割字符串
@property (nonatomic, strong) NSDictionary   *parameters;  // 携带的参数
@property (nonatomic, strong) NSArray        *pictures;    // 封装好的图片的数据

- (void)configRequest:(NSMutableURLRequest **)request;

@end

NETWorkPicUpload.m

//
//  NETWorkPicUpload.m
//  UploadPics
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "NETWorkPicUpload.h"

@implementation NETWorkPicUpload

#pragma mark - 创建图片POST头部信息
- (NSData *)createParametersData
{
    // 生成了头部信息
    NSString        *start = [NSString stringWithFormat:@"--%@", _boundary];
    NSMutableString *body  = [[NSMutableString alloc] init];
    NSArray         *keys  = [_parameters allKeys];

    [keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *key = keys[idx];

        [body appendFormat:@"\r\n%@\r\n", start];
        [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key];
        [body appendFormat:@"%@",_parameters[key]];
    }];

    return [body dataUsingEncoding:NSUTF8StringEncoding];
}

#pragma mark - 创建图片POST尾部信息
- (NSData *)createEndData
{
    NSString *end = [NSString stringWithFormat:@"\r\n--%@--\r\n", _boundary];
    return [end dataUsingEncoding:NSUTF8StringEncoding];
}

#pragma mark - 生成POST需要的数据格式
- (NSData *)createPostData
{
    if (_boundary && _parameters)
    {
        NSMutableData *postData = [NSMutableData data];

        // 添加头
        [postData appendData:[self createParametersData]];

        // 添加图片
        [_pictures enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            if ([obj isKindOfClass:[NSData class]])
            {
                [postData appendData:obj];
            }
        }];

        // 添加尾
        [postData appendData:[self createEndData]];

        return postData;
    }
    else
    {
        return nil;
    }
}

#pragma mark - 创建PNG格式的图片
NSData * createPNGPicture(NSString *formBoundary, UIImage *image,
                          NSString *name,         NSString *filename)
{
    NSString *start = [NSString stringWithFormat:@"--%@", formBoundary];

    // 添加分界线,换行
    NSMutableString *subBody = [[NSMutableString alloc] init];
    [subBody appendFormat:@"\r\n%@\r\n", start];
    [subBody appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n",
     name, filename];

    // 声明上传文件的格式
    [subBody appendFormat:@"Content-Type: image/png\r\n\r\n"];

    // 图片data
    NSData *imageData = UIImagePNGRepresentation(image);

    // 生成图片data
    NSMutableData *tmpData = [NSMutableData data];
    [tmpData appendData:[subBody dataUsingEncoding:NSUTF8StringEncoding]];
    [tmpData appendData:imageData];

    return [NSData dataWithData:tmpData];
}

- (void)configRequest:(NSMutableURLRequest **)request
{
    // 获取到了POST包体
    NSData *data = [self createPostData];

    // 配置请求
    NSMutableURLRequest *tmpRequest = *request;

    // 设置请求POST包体
    tmpRequest.HTTPBody    = data;
    tmpRequest.HTTPMethod  = @"POST";

    // 设置HTTPHeaderField
    [tmpRequest setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]]
      forHTTPHeaderField:@"Content-Length"];
    [tmpRequest setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", _boundary]
      forHTTPHeaderField:@"Content-Type"];
}

@end

使用情况:

上传图片的截图:

说一下几个注意的地方:

以下地方会对request进行一些修改,注意**,这个是指针的指针,你懂得:)

 

大体流程就是:

1. 根据参数创建POST头部信息

2. 填充中间的图片信息

3. 用标示符表示结束信息

4. 对HTTPHeaderField进行一些设置

 

要实现以上这些是需要你对网络知识有着充分理解的:),也许你用惯了第三方开源代码,但不理解原理,还是很难根据需求进行必要修改,这一点需要注意哦.

时间: 2024-11-18 12:09:47

POST请求上传多张图片并携带参数的相关文章

Android上传多张图片到服务器

问题描述 Android上传多张图片到服务器 单张上传我已经成功了,不知道怎么处理多张图片上传,求求求求解!!! 解决方案 http://download.csdn.net/download/javalishilong/6312977 解决方案二: private void toUploadFile(File file String fileKey String RequestURL Map param) { String result = null; requestTime= 0; long

Android ksoap调用webservice批量上传多张图片详解

Android ksoap调用webservice批量上传多张图片详解 这几天一直在开发app,哎呀,什么都是第一接触,想想自己自学Java,然后自学Android,一直没有放弃,曾想放弃的,但是想到爸妈供我上学,不能在宿舍里面玩游戏,加入学校实验室,一天没课就来着里学习,当然这里也有志同道合的人,一起努力一起进步!虽然大学这几年都在努力的学习技术,也没有参加什么活动的,更别说找个女伴了!还是老老实实的敲代码,成功给我带来巨大的潜能,新技术总是吸引着我.自己做项目,哎呀!好像说偏题了,言归正传吧

input file 上传多张图片,如果想删除其中的某张图片或某几张如何处理?

问题描述 input file 上传多张图片,如果想删除其中的某张图片或某几张如何处理? input file 上传多张图片,利用h5显示了所上传的多张图片,如果想删除其中的某张图片或某几张如何处理? 解决方案 file multiple多选无法删除里面已经选中的文件,回一起回发服务器,但是可以通过js记录删除的图片下标,一起回发服务器,然后服务器遍历Files容器保存的时候对比被删除下标,对比成功则不保存这张图片 解决方案二: 你说的删除是在上传前在客户端删除还是在上传后在服务器上删除?是从上

自定义组件事件-JSP中的自定义标签用来上传多张图片文件

问题描述 JSP中的自定义标签用来上传多张图片文件 跪求:自定义标签实现上传图片功能,java中的类代码咋写啊,最好能实现能一次上传多张照片.

javascript-js如何上传多张图片啊?

问题描述 js如何上传多张图片啊? js如何上传多张图片啊?而且,上传的图片下面可以删掉?这个怎么实现啊 解决方案 js实现多张图片切换效果Js实现多张图片无规律的轮流切换jsp页面通过ajax上传多张图片 解决方案二: http://www.xwcms.net/js/tpdm/58911.html 解决方案三: 只针对图片,还是包括其它的文件.比如jsp,txt,png什么的后缀? 解决方案四: 你加我号,我发你.635072739.

spring mvc-springMVC上传多张图片(只用一个上传控件)

问题描述 springMVC上传多张图片(只用一个上传控件) 怎么上传多张图片?我用的框架是springMVC(Ajax+jquery),在网上也搜了好多例子,但都是有多个上传控件(),但我公司要求只能有一个上传控件,当你点"上传图片"选中后,它会显示在一个可编辑的Div里,然后你可以继续上传图片,当点击"保存"后,图片的地址会上传到数据库,上传的图片保存在发布的工程目录下. 本人新手,不喜勿喷...还请各位大牛不吝赐教,本人不胜感激...

azure-我在java rest 请求上传了证书,为何还是认证失败

问题描述 我在java rest 请求上传了证书,为何还是认证失败 大家好, 我使用了keytool 生成了证书,并将证书上传到了azure中,当在请求资源时,仍然显示身份认证失败,请问这是什么原因?? 解决方案 您好,首先您可以先参考下这个类似的问题:http://ask.csdn.net/questions/180024 其次,建议您使用fiddler去抓下具体的错误信息. Regards, Will 如果您想进一步了解Windows Azure, Windows Azure 官网欢迎您的访

iOS开发之如何通过PUT请求上传数据_IOS

一.什么是PUT请求 PUT请求是请求服务器存储一个资源,并用Request-URI作为其标识,跟POST类似,但不常用,PUT请求比较少见.HTML表单也不支持这个.本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定.举个例子:如一个用于提交博文的URL,/addBlog.如果用PUT,则提交的URL会是像这样的"/addBlog/abc123",其中abc1

ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)_实用技巧

在做asp.net的Web开发的时候,我们经常会遇到一次性上传多个文件的需求.通常我们的解决方法是固定放多个上传文件框,这样的解决办法显然是不合理的,因为一次上传多个,就意味着数量不确定.因此我们就要让这些文件上传框动态添加,下面我以我做的一个图库管理中的上传图片的功能为例 先看效果: 打开的初始界面: 默认是上传一个图片,但当我们点"增加图片"按钮时可以实现选择多个图片及其描述同时上传,本功能限制一次最多只能上传8张,且每张图片大小不超过1M,这个大家可根据实际情况更改! 如图: 下