我想用参数(用户名,密码..等)发送我的图像?以下是我的代码:
-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID
{
NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults];
NSString *username = [loginData objectForKey:@"username"] ;
NSString *password = [loginData objectForKey:@"password"];
NSString *postString = [NSString stringWithFormat:@"&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID];
NSString *urlString = @"http://myAPIName/MethodName";
NSURL *myURL = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSMutableURLRequest *detailRequestToServer =[NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
[detailRequestToServer setHTTPMethod:@"POST"];
[detailRequestToServer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
const char *utfString = [postString UTF8String];
NSString *utfStringLenString = [NSString stringWithFormat:@"%zu", strlen(utfString)];
[detailRequestToServer setHTTPBody:[NSData dataWithBytes: utfString length:strlen(utfString)]];
[detailRequestToServer setValue:utfStringLenString forHTTPHeaderField:@"Content-Length"];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:detailRequestToServer delegate:self];
if (theConnection)
{
self.responseData = [[NSMutableData alloc] init];
[GeneralClass startHUDWithLabel:@"Loading…"];
}
else
NSLog(@"Connection Failed!");
}
我知道这个网站上有很多问题,但我不知道在现有代码中需要更改的位置和内容?
那么,请建议我在现有代码中需要更改发送图像的添加功能吗?
注意:没有图片,上面的代码对我来说效果很好。
答案 0 :(得分:2)
我的建议是使用AFNetworking。它将大大简化您的过程,为您节省大量时间。它是开发人员广泛使用的框架。
https://github.com/AFNetworking/AFNetworking
您可以使用几行(POST-multipart request)轻松发送带参数的图像:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
答案 1 :(得分:1)
据我所知,你不能直接发送它作为UIImage。您需要将其转换为NSData,在服务器端解码。
另一种选择是将图像上传到某处,可以通过URL访问。 (但这通常在服务器端完成,并且URL作为响应返回)。
There's a post here关于将UIImage转换为NSData。
答案 2 :(得分:1)
使用此功能,您可以传递参数以及图像数据。
NSString *urlString = [NSString stringWithFormat:@"http://myAPIName/MethodName/test.php&username=%@&password=%@&image=%@&answer=%@&question_id=%@", username, password, imageName, answer, questionID];
NSLog(@"MyURL: %@",urlString);
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *str=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"SourceImage\"; filename=\"Image_%@\"\r\n",[imagePath lastPathComponent]];
[body appendData:[[NSString stringWithString:str] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithContentsOfFile:imagePath]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
答案 3 :(得分:0)
如果您想通过post方法发送带图像的参数,请使用以下代码。它对我来说非常好..
我尝试按照您的要求更改我的代码,然后按照它进行操作
您需要创建NSMutableDictionary
并在其上添加参数,并将此词典作为JSON格式附加到NSMutableData
。 (您需要将 NSMutableData 库添加到您的项目中)
-(void) senRequestForPostAnswerWithImage:(NSString *)imageName andAnswer:(NSString *)answer andQuestionID:(NSString *)questionID
{
NSUserDefaults *loginData = [NSUserDefaults standardUserDefaults];
NSString *username = [loginData objectForKey:@"username"] ;
NSString *password = [loginData objectForKey:@"password"];
// create NSMutableDictionary for store parameter
NSMutableDictionary *dicOfData = [[NSMutableDictionary alloc] init];
[dicOfData setObject:username forKey:@"username"];
[dicOfData setObject:password forKey:@"password"];
[dicOfData setObject:imageName forKey:@"imageName"];
[dicOfData setObject:answer forKey:@"answer"];
[dicOfData setObject:questionID forKey:@"questionID"];
NSString *url = @"http://myAPIName/MethodName";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
/// create NSMutableData to store data of dictionary
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"--iOS Boundary Line--";
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField: @"Content-Type"];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *imgPath = [documentsDir stringByAppendingPathComponent:imageName];
if([imageName length] > 0)
{
if([[NSFileManager defaultManager] fileExistsAtPath:imgPath])
{
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"photo\"; filename=\"%@\"\r\n", imageName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithContentsOfFile:imgPath]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"requestData\"\r\n\r\n%@", [dicOfData JSONRepresentation] ] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
[request addValue:[NSString stringWithFormat:@"%d", [body length]] forHTTPHeaderField:@"Content-Length"];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if (theConnection)
{
self.responseData = [[NSMutableData alloc] init];
}
else
NSLog(@"Connection Failed!");
}
在您的服务器 (PHP) 一侧..您将获得图像(如果您添加了对象和名称)与字典格式中的其他参数。
答案 4 :(得分:-1)
参考此代码 - 它对我来说非常适合 -
NSString *userID = mainDelegate.loginUserPin;
UIImage *imag = self.addImage;
NSString *urlString = mainDelegate.I2K2_Webservice_Url;
NSData *imageData = UIImageJPEGRepresentation(imag, 90);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:6*60000];
NSString *boundary = @"*****";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//Title
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"title\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@~%@",userID,txtName.text] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
//Description
[body appendData:[@"Content-Disposition: form-data; name=\"description\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
NSString *imgNameString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"%@~%@\"\r\n",userID,txtName.text];
NSLog(@"imgNameString : %@",imgNameString);
[body appendData:[[NSString stringWithString:imgNameString] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(@"%@",returnString);
答案 5 :(得分:-1)
您无法通过向Web服务器指定其名称来发送 UIImage 。您应该将其作为 NSData 包含在 HTTP正文中。我使用 ASIHTTPRequest ,这很简单而且完美。使用ASIHTTPRequest。示例代码如下所示
NSData *imgData = UIImageJPEGRepresentation(IMAGE_HERE, 0.9);
formReq = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:urlString]];
formReq.delegate = self;
[formReq setPostValue:VALUE1 forKey:KEY1];
[formReq setPostValue:VALUE2 forKey:KEY2];
if (imgData) {
[formReq setData:imgData withFileName:@"SAMPLE.jpg" andContentType:@"image/jpeg" forKey:IMAGE_KEY];
}
[formReq startSynchronous];