如何在使用Jetty接收的POST请求中读取图像

时间:2013-10-27 00:20:07

标签: java ios objective-c jetty afnetworking

我正在使用jetty服务器,我一直在尝试读取作为表单附加到我收到的POST请求的图像。我尝试了一些模式,但我总是有例外。

//Process POST requests to upload images
private void handleImage(String target, Request baseRequest, HttpServletRequest request,
            HttpServletResponse response) throws Exception{

            //Get image
        byte[] pictureInByte = (request.getParameter("image")).getBytes();  
        InputStream in = new ByteArrayInputStream(pictureInByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

            //Save to disk
        ImageIO.write(bImageFromConvert, "jpeg", new File(
                "new-darksouls.jpg"));



    }

这就是POST的创建方式(这是在iPhone上使用Obj-C)。我在Jetty服务器上收到了请求,但无法读取它。

//Set http client defaults
        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:AS_NET_BASE_URL]];
        [httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [httpClient setDefaultHeader:@"Accept" value:@"application/json"];
        [httpClient setParameterEncoding:AFJSONParameterEncoding];
        [httpClient defaultValueForHeader:@"Accept"];

        //init http request
        NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:route parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

            //Append data (JSON)
            [formData appendPartWithFileData:image
                                        name:@"image"
                                    fileName:@"2"
                                    mimeType:@"image/jpeg"];
        }];

        //Time out
        [request setTimeoutInterval:AS_MI_NET_TIMEOUT_INTERVAL];

        //Init operation
        AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

        //Set completion blocks
        [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

            //Stop indicator
            [self stopNetworkIndicator];

            completion(YES, responseObject);

        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

            [self stopNetworkIndicator];

            NSLog(@"%@", error);

            completion(NO, NULL);
        }];

        //Start spinning
        [self startNetworkIndicator];

        //Send request
        [operation start];

        //No internet, finish method
    }else{
        completion(NO, NULL);
    }

1 个答案:

答案 0 :(得分:1)

AFMultipartFormData班级会创建multipart request

我不认为Jetty支持Servlet 3.0规范(可以让你使用request.getParts()),但你可以使用第三方库(Spring / Apache commons)来解析多部分请求。

搜索“apache commons fileupload multipart”应该找到一些例子。

如果您使用的是Spring,请查看http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch16s08.html