从来自NSUrlRequest的httpcontext获取变量

对于Iphone和asp.net服务器之间的http连接“POST”,这个问题将是一个很好的教程:)我想要做的是将图像从iphone发送到Asp.net服务器; 这是我在objective-c中的uploadImagefunction:

- (IBAction)uploadImage { /* turning the image into a NSData object getting the image back out of the UIImageView setting the quality to 90 */ NSData *imageData = UIImageJPEGRepresentation(image.image, 33); // setting up the URL to post to NSString *urlString = @"MyWebServiceUrl"; // setting up the request object now NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; /* add some header info now we always need a boundary when we post a file also we need to set the content type You might want to generate a random boundary.. this is just the same as my output from wireshark on a valid html post */ NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; /* now lets create the body of the post */ NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; filepath=\"ProfilePic\"; filename=\"ipodfile\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // now lets make the connection to the web NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString); 

}

这是我的webService Fonctions,它解析发送的数据并保存文件:

 public class SaveData : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; bool hasErrors = false; HttpFileCollection filesPosted = context.Request.Files; String filePath = context.Request.QueryString["filepath"]; String fileName = context.Request.QueryString["filename"]; try { if (String.IsNullOrEmpty(fileName) || String.IsNullOrEmpty(filePath) || filesPosted.Count <= 0) hasErrors = true; if (!hasErrors) { HttpContext.Current.Response.Write(WriteFile(filesPosted[0], filePath, fileName)); } else { context.Response.Write("Failed: parsing error"); } } catch (Exception ex) { context.Response.Write("Failed: exception error:::" + ex.Message); } } private string WriteFile(HttpPostedFile file, String filePath, String fileName) { System.IO.Directory.CreateDirectory(filePath); int counter = 0; string path = String.Format("{0}\\{1}.jpg", filePath, fileName); while (System.IO.File.Exists(path)) { counter++; path = String.Format("{0}\\{1}-{2}.jpg", filePath, fileName, counter); } file.SaveAs(path); return path; } public bool IsReusable { get { return false; } } } 

我的问题来自这两行

  String filePath = context.Request.QueryString["filepath"]; String fileName = context.Request.QueryString["filename"]; 

context.Request.QueryString返回null,因此我的hasErrors为false; 任何想法如何解决,将非常感谢,感谢所有人。

查询字符串将从Url参数填充(http://someserver.com/foobar?field1=value1&field2=value2)

要访问POST正文中发送的表单数据,请使用Request.Form["filepath"]或简写Request["filepath"] ,它在Form,QueryString,Cookies和ServerVariables集合中查找项目。

已发布文件的数据可在Request.Files找到

经过一天的尝试,这里的解决方案:

客户代码:

 // post body NSMutableData *body = [NSMutableData data]; // add params (all params are strings) [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"filename"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]]; // add image data if (imageData) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"myImage\"; filename=\"image.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: image/jpeg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } 

Asp.net服务器代码:

 String filePath = context.Request.Form["filename"]; 

希望你喜欢这个问题(教程);)