java - 从objective-c发送文件到java

标签 java objective-c file-upload client-server

上传文件时出现问题。我正在将文件从 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 部分,看看请求正文是如何组合在一起的),或者举一个简单的例子,例如请参阅herehere .

关于java - 从objective-c发送文件到java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868834/

相关文章:

iphone - UIImage 只拉伸(stretch)一部分

java - 如何使用 JSoup 发布文件?

java - 在 JAXP 中使用 XPath 检索 XML 节点和节点属性的值

ios - 最后 UICollectionViewCell 对齐

java - Java的翻译过程是什么?

ios - 如何将背景图像添加到在 iOS 中动态创建的 UItable 单元格

javascript - 更新 jquery 后文件上传不起作用

c# - 通过 FtpWebRequest 上传到 FTP 后无法删除文件

session 类上的 java.lang.NullPointerException

java - 在java中写入套接字时数据去哪里了?