2012-04-17 66 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;