ios能不能后台web上ios上传文件出问题

其他回答(3)
ios上传图片的方式好特别的,好像是变成字符串码什么的,是不是需要转化一下。
园豆:9627
我们以前公司是存的file ,但是现在存的是图片的路径。
好奇葩的问题
清除回答草稿
&&&您需要以后才能回答,未注册用户请先。iOS版本的不能后台播放歌曲吗?【bilibili吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2,583,578贴子:
iOS版本的不能后台播放歌曲吗?
右上角播放设置,视频选项里面有。没有的话就没那功能
贴吧热议榜
使用签名档&&
保存至快速回贴ios通过post上传文件
由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。
上传图片的http post请求的格式是这样的:
Content-type: multipart/form-data, boundary=AaB03x
content-disposition: form- name="field1"
Hello Boris!
content-disposition: form- name="pic"; filename="boris.png"
Content-Type: image/png
... contents of boris.png ...
--AaB03x--
第一行是指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。
boundary=AaB03x说明了AaB03x为分界线。比如 --AaB03x 就是一个分界线的意思
content-disposition: form- name="field1"
Hello Boris!
这句话声明了请求中的一个字段的名称,如field1
以及字段的值,如Hello Boris!
这里类似form表单中的
中间的空行是必须的。
不同的字段之间用分界线分开,分界线需要单独一行,如 --AaB03x--
分界线的下一行,是下一个字段
content-disposition: form- 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的二进制内容,如 <d0a1a0a 000b4
dd79b724 6bc888c88 8c9c8733 55ddb1d5 6a0db486
在http post请求的结尾,需要有一个分界线,但是是前后都有--的:--AaB03x--
以上的这些&#26684;式,是http的规范,每个空行,空&#26684;都是必须的。
下边是iOS的实现代码:
#define HTTP_CONTENT_BOUNDARY @"WANPUSH"
-(BOOL)httpPutData:(NSString*)strUrl FilePath:(NSString*)filePath DataType:(NSString*)dataType {
&#160; &#160; strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
&#160; &#160; NSURL* url = [NSURL URLWithString:strUrl];
&#160; &#160;&#160;
&#160; &#160; NSData* data = [NSData dataWithContentsOfFile:filePath];
&#160; &#160; NSString* fileName = [filePath lastPathComponent];
&#160; &#160;&#160;
&#160; &#160; NSString* strBodyBegin = [NSString stringWithFormat:@"--%@\nContent-Disposition: form- name=\"%@\"; filename=\"%@\"\nContent-Type: %@\n\n", HTTP_CONTENT_BOUNDARY, @"file", &#160;fileName, dataType];
&#160; &#160; NSString* strBodyEnd = [NSString stringWithFormat:@"\n--%@--",HTTP_CONTENT_BOUNDARY];
&#160; &#160;&#160;
&#160; &#160; NSMutableData *httpBody = [NSMutableData data];
&#160; &#160; [httpBody appendData:[strBodyBegin dataUsingEncoding:NSUTF8StringEncoding]];
&#160; &#160; [httpBody appendData:data];
&#160; &#160; [httpBody appendData:[strBodyEnd dataUsingEncoding:NSUTF8StringEncoding]];
&#160; &#160;&#160;
&#160; &#160; NSMutableURLRequest* httpPutRequest = [[NSMutableURLRequest alloc] init];
&#160; &#160; [httpPutRequest setURL:url];
&#160; &#160; [httpPutRequest setHTTPMethod:@"POST"];
&#160; &#160; [httpPutRequest setTimeoutInterval: 60000];
&#160; &#160; [httpPutRequest setValue:[NSString stringWithFormat:@"%@", @(httpBody.length)] forHTTPHeaderField:@"Content-Length"];
&#160; &#160; [httpPutRequest setValue:[NSString stringWithFormat:@"multipart/form- boundary=%@",HTTP_CONTENT_BOUNDARY] forHTTPHeaderField:@"Content-Type"];
&#160; &#160; httpPutRequest.HTTPBody = httpB
&#160; &#160;&#160;
&#160; &#160; NSHTTPURLResponse* httpResponse =
&#160; &#160; NSError *error = [[NSError alloc] init];
&#160; &#160; NSData *responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&httpResponse error:&error];
&#160; &#160; if (httpResponse == nil) {
&#160; &#160; &#160; &#160; NSLog(@"url: %@\nerror_code: %@", strUrl, error);
&#160; &#160; &#160; &#160; return NO;
&#160; &#160; }
&#160; &#160; if (httpResponse.statusCode != 200) {
&#160; &#160; &#160; &#160; NSLog(@"url: %@\nHTTP response: %ld", strUrl, (long)httpResponse.statusCode);
&#160; &#160; &#160; &#160; return NO;
&#160; &#160; }
&#160; &#160;&#160;
&#160; &#160; return YES;
后台php代码:1添加评论分享收藏感谢收起写回答iOS上传图像到服务器PHP接收的几种方法
1. 将图片转换为Base64编码,POST上传。PHP将Base64解码为二进制,再写出文件。缺点:不能上传较大的图片 // iOS(Swift)func upload(image: UIImage, url: String) { let imageData = UIImageJPEGRepresentation(image
1. 将图片转换为Base64编码,POST上传。PHP将Base64解码为二进制,再写出文件。缺点:不能上传较大的图片
// iOS(Swift)
func upload(image: UIImage, url: String) {
let imageData = UIImageJPEGRepresentation(image, 0.3) // 将图片转换成jpeg格式的NSData,压缩到0.3
let imageStr = imageData?.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) // 将图片转换为base64字符串
let params: NSDictionary = [&file&: imageStr!]
let manager = AFHTTPRequestOperationManager()
// 采用POST的方式上传,因为POST对长度没有限制
manager.POST(url, parameters: params, success: { (_: AFHTTPRequestOperation!, response: AnyObject!) in
}) { (_: AFHTTPRequestOperation!, _: NSError!) in
header(&#39;Content-type: text/ charset=UTF-8&#39;);
$base64 = $_POST[&file&]; // 得到参数
$img = base64_decode($base64); // 将格式为base64的字符串解码
$path = &md5(uniqid(rand()))&.&.jpg&; // 产生随机唯一的名字作为文件名
file_put_contents($path, $img); // 将图片保存到相应位置
2.AFNetworking上传,PHP端通过正常接收网页上传方法来接收图片
static func uploadPortrait(image: UIImage, url: String) {
let manager = AFHTTPRequestOperationManager()
// fromData: AFN封装好的http header类,可以添加请求体
manager.POST(url, parameters: [:], constructingBodyWithBlock: { (fromData: AFMultipartFormData!) in
let pngData = UIImagePNGRepresentation(image)
// name必须和后台PHP接收的参数名相同($_FILES[&file&])
// fileName为图片名
fromData.appendPartWithFileData(pngData, name: &file&, fileName: &image.png&, mimeType: &image/png&)
// let jpegData = UIImageJPEGRepresentation(image, 0.3)
// fromData.appendPartWithFileData(jpegData, name: &file&, fileName: &image.jpg&, mimeType: &image/jpeg&)
}, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) in
}) { (operation: AFHTTPRequestOperation!, error: NSError!) in
header(&#39;Content-type: text/ charset=UTF-8&#39; );
* $_FILES 文件上传变量,是一个二维数组,第一维保存上传的文件的数组,第二维保存文件的属性,包括类型、大小等
* 要实现上传文件,必须修改权限为加入可写 chmod -R 777 目标目录
// 文件类型限制
// &file&名字必须和iOS客户端上传的name一致
if (($_FILES[&file&][&type&] == &image/gif&)
|| ($_FILES[&file&][&type&] == &image/jpeg&)
|| ($_FILES[&file&][&type&] == &image/png&)
|| ($_FILES[&file&][&type&] == &image/pjpeg&))
// && ($_FILES[&file&][&size&] & 20000)) // 小于20k
if ($_FILES[&file&][&error&] & 0) {
echo $_FILES[&file&][&error&]; // 错误代码
$fillname = $_FILES[&#39;file&#39;][&#39;name&#39;]; // 得到文件全名
$dotArray = explode(&#39;.&#39;, $fillname); // 以.分割字符串,得到数组
$type = end($dotArray); // 得到最后一个元素:文件后缀
$path = &../portrait/&.md5(uniqid(rand())).&#39;.&#39;.$ // 产生随机唯一的名字
move_uploaded_file( // 从临时目录复制到目标目录
$_FILES[&file&][&tmp_name&], // 存储在服务器的文件的临时副本的名称
echo &成功&;
echo &文件类型不正确&;
3.将图片封装在Http的请求报文中的请求体(body)中上传。也是AFN上传的原理
// 使用OC封装
#import &UIKit/UIKit.h&
@interface RequestPostUploadHelper : NSObject
+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)
#import &RequestPostUploadHelper.h&
@implementation RequestPostUploadHelper
+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params {
[params setObject:uploadImage forKey:@&file&];
//分界线的标识符
NSString *TWITTERFON_FORM_BOUNDARY = @&AaB03x&;
//根据url初始化request
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10];
//分界线 --AaB03x
NSString *MPboundary=[[NSString alloc]initWithFormat:@&--%@&,TWITTERFON_FORM_BOUNDARY];
//结束符 AaB03x--
NSString *endMPboundary=[[NSString alloc]initWithFormat:@&%@--&,MPboundary];
//要上传的图片
UIImage *image=[params objectForKey:@&file&];
//得到图片的data
NSData* data = UIImagePNGRepresentation(image);
//http body的字符串
NSMutableString *body=[[NSMutableString alloc]init];
//参数的集合的所有key的集合
NSArray *keys= [params allKeys];
//遍历keys
for(int i = 0; i & [keys count]; i++)
//得到当前key
NSString *key = [keys objectAtIndex:i];
//如果key不是file,说明value是字符类型,比如name:Boris
if(![key isEqualToString:@&file&])
//添加分界线,换行
[body appendFormat:@&%@\r\n&,MPboundary];
//添加字段名称,换2行
[body appendFormat:@&Content-Disposition: form- name=\&%@\&\r\n\r\n&,key];
//添加字段的值
[body appendFormat:@&%@\r\n&,[params objectForKey:key]];
////添加分界线,换行
[body appendFormat:@&%@\r\n&,MPboundary];
//声明file字段,文件名为image.png
[body appendFormat:@&Content-Disposition: form- name=\&file\&; filename=\&image.png\&\r\n&];
//声明上传文件的格式
[body appendFormat:@&Content-Type: image/png\r\n\r\n&];
//声明结束符:--AaB03x--
NSString *end=[[NSString alloc] initWithFormat:@&\r\n%@&,endMPboundary];
//声明myRequestData,用来放入http body
NSMutableData *myRequestData = [NSMutableData data];
//将body字符串转化为UTF8格式的二进制
[myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
//将image的data加入
[myRequestData appendData:data];
//加入结束符--AaB03x--
[myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
//设置HTTPHeader中Content-Type的值
NSString *content=[[NSString alloc]initWithFormat:@&multipart/form- boundary=%@&,TWITTERFON_FORM_BOUNDARY];
//设置HTTPHeader
[request setValue:content forHTTPHeaderField:@&Content-Type&];
//设置Content-Length
[request setValue:[NSString stringWithFormat:@&%d&, [myRequestData length]] forHTTPHeaderField:@&Content-Length&];
//设置http body
[request setHTTPBody:myRequestData];
//http method
[request setHTTPMethod:@&POST&];
static func uploadPortrait(image: UIImage, url:String) {
let request = RequestPostUploadHelper.uploadImage(url, uploadImage: image, params: [:])
// 异步网络请求
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in
if error != nil {
// PHP代码和上一步相同
4.iOS图片转换为NSData,通过POST上传。PHP接收POST参数,将NSData的16进制编码转换为PHP支持的二进制,再写出文件保存
暂时没有找到办法,PHP接收到16进制编码后,&使用算法&转换为二进制后无法输出图片
5.二进制POST上传。PHP直接将数据保存为图片
暂时没有找到办法,iOS端使用NSData的getBytes无法转换为二进制
(责任编辑:最模板)
------分隔线----------------------------
项目经过需求的变更,产品迭代,再多次的改版之后,有些不再...
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个...
iOS 的倒计时有多种实现细节,Cocoa Touch 为我们提供了 NSTimer 类和...
不管是Apple还是Google都有自己的设计理念,为苹果开发者和安卓...
首先讲一下关于线程的基础知识。 1.什么是进程? 进程是指在系...
CopyRight (C)
最模板 ZuiMoban.Com, 深圳奇好科技有限公司 All Rights Reserved.

我要回帖

更多关于 ios上传文件 的文章

 

随机推荐