2

上传文件有问题。我正在将文件从objective-c发送到java;

服务器端:

记录器没有出现在tomcat中。

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody MessageWrapper getMessage(@RequestBody MessageWrapper msg,  @RequestParam("photo") MultipartFile file) throws Exception {
logger.info("Send");
/*
    my code
*/

return msg;
}

客户端:

__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

[request setData:message.imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];

NSArray *toEmail = [message.to componentsSeparatedByString:@","];
NSArray *objects = [NSArray arrayWithObjects:toEmail, message.subject, message.content, nil];
NSArray *keys = [NSArray arrayWithObjects:@"to", @"subject", @"body", nil];

NSDictionary *msgDict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
NSString *jsonRequest = [msgDict JSONRepresentation];
NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]];
[request setRequestMethod:@"POST"];
[request setUseCookiePersistence:NO];
[request addRequestHeader:@"Content-type" value:@"application/json"];
[request setRequestCookies:[NSMutableArray arrayWithObject:[self setKidCookieParams]]];
[request setDelegate:self];
[request setPostBody:[[NSMutableData alloc] initWithData:requestData]];
[request startAsynchronous];

它工作正常,没有以下几行:

[request setData:message.imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
and server side like  this:
@RequestMapping(method = RequestMethod.POST)
 public @ResponseBody MessageWrapper sendMessage(@RequestBody MessageWrapper msg) throws Exception {
    logger.info("Send");
    /*
        my code
    */

  return msg;
 }

请帮我。提前致谢!

4

1 回答 1

2

您的问题是您混合了@RequestBody(假定使用完整的请求正文)和 a @RequestParam(它应该代表文件数据,将成为请求正文的一部分)。让请求主体完全被一个项目消耗并将其中的一部分作为另一个参数传入是行不通的。在 Objective-C 方面类似,您首先photo向请求正文添加一个参数,然后用setPostBody:.

相反,在服务器端,您需要将 声明MessageWrapper msg为单独的@RequestParam,并希望 JSONDeserializer 能够正确获取它。如果没有,首先使用@RequestParam String msg并查看是否至少到达了 JSON 字符串值,然后尝试使反序列化工作。

然后Objective-C部分也需要更新。我对Objective-C不是很熟悉,但是我觉得有必要,而不是[request setPostBody:[[NSMutableData alloc] initWithData:requestData]];你需要添加JSON部分作为这个multipart-fileupload的单独参数,并且请求头Content-Type应该是 multipart/form-data,表明你在这里上传了几个项目.

在这个 SO 问题上:http 文件上传目标 C 我找到了一个指向http://cocoadev.com/wiki/HTTPFileUpload的指针 正如那边所说,该页面几乎不可读,但在底部是一些提交数据的代码字典“名称”->“值”,其中“值”可以是字符串或文件,也许您可​​以根据自己的目的进行调整。这个例子手动构建了完整的请求主体——我不确定,但我认为同时在 Objective-C 中有更方便的选项。

例如,我想知道是否简单地调用类似的东西[request addData:requestData forKey:@"msg"],但是,这里没有 Objective-C 环境,因此没有经过测试。

如果您真的想知道 http 文件上传幕后发生的事情(请这样做,了解这些东西会使编程变得更容易),请阅读有关文件上传的RFC 1867 (暂时忽略 HTML 部分并查看请求正文放在一起),或者举个简单的例子,例如看这里这里

于 2013-02-16T13:03:15.520 回答