IT新闻:

【IOS学习之路】关于GPRS下上传文件,ASIFormDataRequest在2G网络下上传失败(已解决)iphone开发

这几天真是把我算是认清楚了ASIHTTPRequest,我的客户端上需要上传一个文件到我的服务器上,在不是中国移动的网络中上传文件使用ASIHTTPRequest是一点没有问题的,但是要是遇到了中国移动,我不得不说,fuck

下面说解决的代码

[self setRequest:[ASIFormDataRequest requestWithURL:[NSURL URLWithString:UPLOADFILE_ADDRESS]]];
NSData *data = [NSData dataWithContentsOfFile:self.filepath];
NSLog(@"crystr = %@",_crystr);
NSLog(@"userid = %@",_userinfo.userId);
[_request setPostValue:_userinfo.userId	forKey:@"userID"];
[_request setPostValue:@"14"		forKey:@"uploadTypeID"];
[_request setPostValue:@"11"		forKey:@"Applicationid"];
[_request setPostValue:_crystr		forKey:@"crystr"];
[_request addData:data withFileName:self.filepath andContentType:@"image/png" forKey:@"FileData"];
[_request setDelegate:self];
[_request setUploadProgressDelegate:self];
_request.showAccurateProgress = YES;
[_request setTimeOutSeconds:30];
[_request startAsynchronous];
[_request setTag:UPLOAD_FILE];

  上面这是我使用ASIHTTPRequest写的方式,要是遇到iphone客户端还是绕了吧,估计你会头痛,换用下面的方式,

首先看下我服务端上传数据时候回使用的一些数据,根据这些数据然后配置自己网络请求需要使用到的一些上传方式

Content-Type:
multipart/form-data; boundary=----------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0
Content-Disposition: form-data; name="userid" 12312 ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="id" 198653687 ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="applicationid" 11 ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="crystr" 70C0C406225F2545F37BD231BBDCA780 ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="uploadTypeID" 14 ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="Filedata"; filename="ss.jpg" Content-Type: application/octet-stream ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="Upload" Submit Query ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 --------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0 Content-Disposition: form-data; name="Filename" ss.jpg ------------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0

  下面写上在在c#中我是怎么上传图片文件的方式

WebRequest req = WebRequest.Create("http://localhost:802/uploadimg.aspx");
            req.ContentType = "multipart/form-data; boundary=" + boundary;
            req.Method = "POST";
            //组织表单数据
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, string> dicItem in inputDic)
            {
                sb.Append("--" + boundary);
                sb.Append("\r\n");
                sb.Append("Content-Disposition: form-data; name=\"" + dicItem.Key + "\"");
                sb.Append("\r\n");
                sb.Append("\r\n");
                sb.Append(dicItem.Value);/alue前面必须有2个换行
                sb.Append("\r\n");
            }
            //拼接文件控件
            sb.Append("--" + boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"Filedata\"; filename=\"1e4c9eb5a6a1059f37d3ca70[1].jpg\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            string head = sb.ToString();
            byte[] form_data = Encoding.UTF8.GetBytes(head);
            //结尾
            byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
            //文件
            FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            //post总长度
            long length = form_data.Length + fileStream.Length + foot_data.Length;
            req.ContentLength = length;
            Stream requestStream = req.GetRequestStream();
            //发送表单参数
            requestStream.Write(form_data, 0, form_data.Length);
            //文件内容
            byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);
            //结尾
            requestStream.Write(foot_data, 0, foot_data.Length);
            requestStream.Close();

  参考上面的方式修改代码就有了O-C上传文件的方式

//服务器的路径
NSData *data = [[[NSMutableData alloc] initWithLength:256*1024] autorelease];
NSString *filePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"file.jpg"];
UIImage *img = [UIImage imageNamed:@"2.jpg"];
[UIImageJPEGRepresentation(img, 1) writeToFile:filePath atomically:NO];
//NSString *filePath=upLoadFilePath.text;
NSData *fileData =[[NSData alloc] initWithContentsOfFile:filePath];  
//NSLog(@"fileData = %@",fileData);
//压缩数据,检查上传文件后发现乱码,所以应用时得解码
//NSData *fileData=[self compress:Data];
//64位数据编码,不知如何测试其编码是否成功
//NSString *data=[UploadAndDownloadViewController base64forData:fileData];
//获取当前路径下文件名,为上传同名做准备
 NSFileManager *fileManager = [[NSFileManager alloc] init];
 NSString *displayNameAtPath = [fileManager displayNameAtPath:filePath];
//将要上传文件路径  
NSString *urlString =@"上传文件的地址";
	
//文件传输请求  
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];  
[request setURL:[NSURL URLWithString:urlString]];  
[request setHTTPMethod:@"POST"];  
	
//迷惑
NSString *boundary = [NSString stringWithString:@"----------ae0GI3Ef1Ef1Ij5GI3KM7ae0Ij5ae0"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];  
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];  
//数据传输格式,组合http传输的,数据包头、数据、包尾
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary]dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userID\"\r\n\r\n%@\r\n",@"39562858"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary]dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadTypeID\"\r\n\r\n%@\r\n",@"14"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary]dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Applicationid\"\r\n\r\n%@\r\n",@"11"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary]dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"crystr\"\r\n\r\n%@\r\n",@"07416F9D3B9C9899221C87B88DB93B4B"] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"Filedata\"; filename=\"%@\"\r\n",filePath] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];  
[body appendData:[NSData dataWithData:fileData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];  
    
[request setHTTPBody:body];
NSString *str = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];
NSLog(@"str = %@", str);
	
//请求同步加载
//NSURLResponse *urlResponse;
//[NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:nil];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
	
}

- (void)connection:(NSURLConnection *)theConnection
	didReceiveData:(NSData *)incrementalData {
	
    NSString *str = [[NSString alloc] initWithData:incrementalData encoding:NSUTF8StringEncoding];
	NSLog(@"str = %@", str);
}

  OK

posted @ 2012-12-07 17:12  胡藟壘  阅读(1045)  评论(0)    收藏  举报