有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将文件从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) 个答案

  1. # 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部分,看看请求主体是如何组合起来的),或者举一个简单的例子,例如参见herehere