上传图像从iOS应用程序到PHP – 不能完全正确 – 我错过了什么?

首先,我知道这个问题已经被问了上千次了。 我又问了一遍,因为我试过其他例子中的解决scheme,他们不为我工作,我不知道为什么。 每个人似乎都有一个稍微不同的方法。

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); } } } 

目前我在postParams中传递NSData,并使用这个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(); } } 

这是将数据保存到文件,但我无法打开它,因为它是损坏或一些这样的事情。 这几乎是最后一次努力,我并没有真正期望它能够这样工作,但是它和我一直接近的那样接近。

我试过使用各种内容头/边界/ $ _FILES / enctype内容types的方法,但我甚至不能把它发送到正确的脚本。

  • 顺便说一句,我不只是发送图像数据,我也张贴postParams其他值只是string,整数等

有没有人有任何build议或知道有任何好的来源呢?

感谢您提供的任何帮助。


目前的状态是在遵循下面的答案(也是来自程序的其他部分的进一步的信息)给出的build议之后:

图像的初始捕获:

 - (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和form.signature是一个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(); } 

这是给我的{成功: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);