上传文件时出现问题。我正在将文件从 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;
}
请帮帮我。预先感谢!
最佳答案
您的问题是您混合了 @RequestBody
(假定消耗完整的请求正文)和 @RequestParam
(它应该代表文件数据,将是请求正文的一部分)。让请求主体完全被一项所消耗,并将其一部分作为另一个参数传入是行不通的。与 Objective-C 端类似,您首先将 photo
参数添加到请求正文,然后使用 setPostBody:
覆盖完整正文。
相反,在服务器端,您需要将 MessageWrapper msg
声明为单独的 @RequestParam
,并希望 JSONDeserializer 能够正确拾取它。如果没有,请首先使用 @RequestParam String msg
并查看是否至少有 JSON 字符串值到达,然后尝试使反序列化工作。
那么 Objective-C 部分也需要更新。我对 Objective-C 不太熟悉,但我觉得有必要将 JSON 部分添加为这个multipart-fileupload的单独参数,请求头Content-Type
应该是multipart/form-data
,表明您在这里上传多个项目。
在这个问题上:http file upload Objective C 我找到了一个指向 http://cocoadev.com/wiki/HTTPFileUpload 的指针正如那里所说,该页面几乎不可读,但底部是一些代码,提交以字典“名称”->“值”形式给出的数据,其中“值”可以是字符串或文件,也许你可以根据您的目的进行调整。这个例子手动构造了完整的请求体 - 我不确定,但我认为同时 Objective-C 中有更方便的选项。
例如,我想知道简单地调用类似 [request addData:requestData forKey:@"msg"]
的方法是否有效,但是这里没有 Objective-C 环境,因此没有经过测试。
如果您确实想了解 http 文件上传的幕后情况(请这样做,了解这些内容可以使编程变得更容易),请阅读 RFC 1867文件上传(暂时忽略 HTML 部分,看看请求正文是如何组合在一起的),或者举一个简单的例子,例如请参阅here或here .
关于java - 从objective-c发送文件到java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868834/