Во-первых, я знаю, что этот вопрос задавали тысячу раз. Я снова спрашиваю, потому что я пробовал решения в других примерах, и они не работают для меня, и я не знаю, почему. Кажется, у каждого есть несколько иной подход.
NSData *imageData = UIImagePNGRepresentation(form.image); NSURL *url = [NSURL URLWithString:@"myscript.php"]; NSMutableString *postParams = [[NSMutableString alloc] initWithFormat:@"&image=%@", imageData]]; NSData *postData = [postParams dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postLength = [[NSString alloc] initWithFormat:@"%d", [postData length]]; NSMutableURLRequest *connectRequest = [[NSMutableURLRequest alloc] init]; [connectRequest setURL:url]; [connectRequest setHTTPMethod:@"POST"]; [connectRequest setValue:postLength forHTTPHeaderField:@"Content-Length"]; [connectRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; //[connectRequest setValue:@"image/png" forHTTPHeaderField:@"Content-Type"]; [connectRequest setHTTPBody:postData]; NSData *receivedData; NSDictionary *jsonData; NSURLConnection *connectConnection = [[NSURLConnection alloc] initWithRequest:connectRequest delegate:self]; NSError *error = nil; if (!connectConnection) { receivedData = nil; NSLog(@"The connection failed!"); } else { NSLog(@"Connected!"); receivedData = [NSURLConnection sendSynchronousRequest:connectRequest returningResponse:NULL error:&error]; } if (!receivedData) { NSLog(@"Data fetch failed: %@", [error localizedDescription]); } else { NSLog(@"The data is %lu bytes", (unsigned long)[receivedData length]); NSLog(@"%@", receivedData); if (NSClassFromString(@"NSJSONSerialization")) { id object = [NSJSONSerialization JSONObjectWithData:receivedData options:0 error:&error]; if (!object) { NSLog(@"JSON Serialization failed: %@", [error localizedDescription]); } if ([object isKindOfClass:[NSDictionary class]]) { jsonData = object; NSLog(@"json data: %@", jsonData); } } }
На данный момент я передаю NSData в postParams и используя этот php-скрипт:
if (isset($_POST['image']) && !empty($_POST['image'])) { if (file_put_contents('images/test.png', $_POST['image'])) { echo '{"saved":"YES"}'; die(); } else { echo '{"saved":"NO"}'; die(); } }
Это сохранение данных в файл, но я не могу открыть его, поскольку он поврежден или что-то подобное. Это было почти последнее усилие, и я действительно не ожидал, что он будет работать таким образом, но он настолько близок, насколько я дошел до того, чтобы понять это правильно.
Я пробовал использовать различные методы content content / border / $ _FILES / enctype content-type, но я даже не могу заставить его правильно отправлять сценарий.
Есть ли у кого-нибудь какие-либо предложения или какие-либо хорошие источники для этого?
Спасибо за любую помощь.
Текущее состояние после следующих рекомендаций, приведенных в ответах ниже (также дополнительная информация из других частей программы):
Первоначальный захват изображения:
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.view endEditing:YES]; __unused form *form = self.form; form.signature = self.signatureDrawView.bp; UIGraphicsBeginImageContext(self.signatureDrawView.bounds.size); [self.signatureDrawView.layer renderInContext:UIGraphicsGetCurrentContext()]; campaignForm.signatureImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); }
где signatureDrawView – это UIView, а форма. signign – это UIBezierpath.
тогда…
NSData *sigImage = UIImagePNGRepresentation(campaignForm.signatureImage);
который передается следующей функции:
- (void)uploadImage:(NSData *)imageData { NSMutableURLRequest *request; NSString *urlString = @"https://.../upload.php"; NSString *filename = @"uploadTest"; 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 *postbody = [NSMutableData data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.png\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:imageData]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString; returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString); }
upload.php выглядит так:
if ($_FILES["file"]["error"] > 0) { echo '{"file":"'.$_FILES['file']['error'].'"}'; die(); } else { $size = $_FILES["file"]["size"] / 1024; $upload_array = array( "Upload"=>$_FILES["file"]["name"], "Type"=>$_FILES["file"]["type"], "Size"=>$size, "Stored in"=>$_FILES["file"]["tmp_name"] ); //echo json_encode($upload_array); if (move_uploaded_file($_FILES["file"]["tmp_name"], "signatures/" . $_FILES["file"]["name"])) { echo '{"success":"YES"}'; die(); } else { echo '{"success":"NO"}'; die(); } die(); }
Это дает мне результат {success: NO}, а дамп $ upload_array показывает нулевые значения.
Поместите следующий код, вы можете получить помощь
NSData *myData=UIImagePNGRepresentation([self.img image]); NSMutableURLRequest *request; NSString *urlString = @"http://xyzabc.com/iphone/upload.php"; NSString *filename = @"filename"; request= [[[NSMutableURLRequest alloc] init] autorelease]; [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 *postbody = [NSMutableData data]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [postbody appendData:[NSData dataWithData:myData]]; [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [request setHTTPBody:postbody]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString; returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"%@", returnString);