2012-04-17 64 views
1

我正在构建一个iOS应用程序,我想将图像上传到ASP.NET MVC服务器组件,例如在网页中发布文件。使用什么请求标头将图像文件从iOS上传到ASP.NET?

我在iOS中创建了NSMutableURLRequest和NSConnection对象,并验证了.NET服务器组件正在工作。

NSMutableURLRequest *request=[[NSMutableURLRequest alloc]init]; 
[request setTimeoutInterval:(interval==0?SERVICE_DEFAULT_TIMEOUT_INTERVAL:interval)]; 
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",SERVICE_BASEURL,url]]]; 
[request setHTTPMethod:@"POST"]; 
... 

的图像数据是在一个NSData对象从AVFoundation模块

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 

在服务器中.NET组件控制器的方法是

[HttpPost] 
public JsonResult UploadMedia(HttpPostedFileBase fileData) 
{ 
... 
    return Json(@"Success"); 
} 

目标是传送将图像数据发送到服务器并存储它。我的问题是:

  1. 还需要创建其他HttpHeaderField值?
  2. 我应该如何在NSMutableURLRequest中嵌入图像数据?
  3. .NET组件方法中应该使用什么类型的参数?
  4. 根据#3中的类型,我应该如何提取服务器组件中的图像数据?
+1

事实证明,与HTML文件来自.NET中的iOS文件时不同,该文件不会自动作为HttpPostedFileBase的实例路由到控制器方法。您必须使用HttpContext.Request.Files属性来访问它。 – ChrisP 2012-04-18 20:20:16

+0

您是不是在.net中遇到这个问题? [InvalidOperationException]:由于对象的当前状态,操作无效。 我读了一些关于它,甚至添加密钥 aspnet:MaxHttpCollectionKeys aspnet:MaxJsonDeserializerMembers 不断得到相同的结果... – dwbrito 2012-09-26 12:54:30

回答

1

您可以发布数据使用多部分表单数据。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
             cachePolicy:NSURLRequestUseProtocolCachePolicy 
                timeoutInterval:600]; 

request.HTTPMethod = @"POST"; 

NSString *boundry = @"---------------AF7DAFCDEFAB809"; 
NSMutableData *data = [NSMutableData dataWithCapacity:300 * 1024]; 

[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n\r\n", @"field name"] 
          dataUsingEncoding:NSUTF8StringEncoding]]; 
[data appendData:imgdata]; // data upload 
[data appendData:[[NSString stringWithString:@"\r\n"] 
          dataUsingEncoding:NSUTF8StringEncoding]]; 

[data appendData:[[NSString stringWithFormat:@"--%@\r--\n",boundry] 
        dataUsingEncoding:NSUTF8StringEncoding]]; 

request.HTTPBody = data;