使用URL参数的iPhone和asp.NET MVC文件上传

时间:2013-06-12 20:56:13

标签: iphone asp.net asp.net-mvc nsurlconnection nsurlrequest

这将是一个关于将数据从iPhone发送到MVC 3功能的问题。

要了解我正在做的事情以及正在发挥作用的主题,只是为了看看我如何实现连接的风格。

这里我有一个示例MVC Controller函数,在我的IIS 7.0上运行。

SampleController :控制器

public ActionResult MyFunction(MyObject object) {
    ContentResult result = new ContentResult();
    result.Content = some content from the server encoded as JSON
    return result;
}

在iPhone上,我这样称呼这个功能。

NSString *urlString = [NSString stringWithFormat:@"https://%@:%d/%@/%@", _host, _port, Sample, MyFunction];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

[request setHTTPBody:json]; // some json encoded object that fits the MyObject from asp.NET

NSURLResponse *response;
NSError *error;
// synchronous so the sample code is shorter
NSData *data = [NSURLConnection sendSynchronousRequest:request
                                     returningResponse:&response
                                                 error:&error];

// Do some error handling and http status code stuff and finally the json stuff from the NSData object

所以这些东西都运转正常,但现在我处于令人困惑的地步。我需要上传一个NSData对象,包含图像数据或其他东西。使用mulipart / form-data仅上传文件,如图in this SO answer所示。但是当添加一些url参数时,它就不再起作用了。

________________________________________________________________________________________

所以现在有两个选项来解决我的问题:

第一种方法是: NSURLRequest如何使用这样的函数?或者这甚至可能吗?

public ActionResult MyFunction(MyObject object, byte[] binaryData) {
    // Some server stuff ect.
}

或者如何使用我的第一个功能并添加文件附件来构建我的NSURLRequest?

修改

以下是我构建当前文件上传请求的方法。它基本上与我在第二个代码片段中所做的相同。

NSString *urlString = [NSString stringWithFormat:@"https://%@:%d/%@/%@", _host, _port, Sample, MyFunction];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

[request setHTTPBody:json];

最后文件附件。 注意当仅使用没有参数的文件附件时,一切正常,但是好了,因为params丢失了。

+ (void)attachFile:(NSData *)fileData withFilename:(NSString *)filename toRequest:(NSMutableURLRequest *)request {
NSString *boundary = @"---------------------------94712889831966399282116247425";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", filename]
                  dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"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]];

NSData *oldBody = [request HTTPBody];
if (oldBody) {
    [body appendData:oldBody];
}

[request setHTTPBody:body];
}

所以现在我的猜测是,参数缺失会有一些边界内容。

注意

作为补充,我在后台线程上使用同步NSURLConnection。

NSURLResponse *response;
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:request
                                     returningResponse:&response
                                                 error:&error];

1 个答案:

答案 0 :(得分:1)

从给定的样本(请添加更多实际代码),很难说出存在问题的地方 - 但是有一些潜在的罪魁祸首。

首先,请求取决于您的服务器将接受的内容。

POST请求通常在multipart / form-data主体中嵌入“参数”。浏览器不会在URL中包含“参数” - 服务器也可能不会期望或接受它。