将文件从Objective发送到java
上传文件有问题。我正在将文件从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;
}
请帮帮我。提前谢谢
# 1 楼答案
您的问题是混合了
@RequestBody
(假定它使用完整的请求体)和@RequestParam
(假定它代表文件数据,将是请求体的一部分)。让一个项目完全使用请求主体,并将其一部分作为另一个参数传入,这样做是行不通的。与Objective-C类似,首先向请求主体添加一个photo
参数,然后用setPostBody:
覆盖整个主体相反,在服务器端,您需要将
MessageWrapper msg
声明为一个单独的@RequestParam
,并希望JSONDeserializer正确地获取它。如果没有,首先使用@RequestParam String msg
,看看是否至少有JSON字符串值到达,然后尝试进行反序列化那么Objective-C部分也需要更新。我对Objective-C不是很熟悉,但我觉得有必要将JSON部分添加为这个多部分文件上传的一个单独参数,而不是
[request setPostBody:[[NSMutableData alloc] initWithData:requestData]];
,请求头Content-Type
应该是multipart/form-data
,这表明您在这里上传了几个项目在这个问题上:http file upload Objective C 我发现了一个指向http://cocoadev.com/wiki/HTTPFileUpload的指针,正如那边所说,该页面几乎不可读,但底部是一些提交数据的代码,这些数据以字典“name”的形式给出;“value”,其中“value”可以是字符串或文件,也许你可以根据自己的目的调整它。这个示例手动构造完整的请求主体——我不确定,但我认为同时Objective-C中有更方便的选项
例如,我想知道简单地调用
[request addData:requestData forKey:@"msg"]
之类的东西是否有效,但是,这里没有Objective-C环境,因此没有经过测试如果你真的想知道http文件上传背后发生了什么(请这样做,理解这些东西会让编程变得更容易),请阅读RFC 1867on file upload(暂时忽略HTML部分,看看请求主体是如何组合起来的),或者举一个简单的例子,例如参见here或here