将图像从 iOS 应用程序上传到 php --- 不能完全正确 --- 我错过了什么?
首先,我知道这个问题已经被问了一千次了.我再次问,因为我已经尝试了其他示例中的解决方案,但它们对我不起作用,我不知道为什么.每个人的方法似乎略有不同.
Firstly, I know this question has been asked a thousand times. I'm asking again because I've tried the solutions in the other examples and they are not working for me and I don't know why. Everyone seems to have a slightly different approach.
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 脚本:
At the moment I am passing the NSData in the postParams and using this php script:
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();
}
}
这是将数据保存到文件中,但我无法打开它,因为它已损坏或诸如此类.这几乎是最后的努力,我真的没想到它会以这种方式工作,但它与我到目前为止所做的一样接近.
This is saving the data to a file but I can't open it as it is corrupted or some such thing. This was pretty much a last ditch effort and I didn't really expect it to work this way but it's as close as I've come so far to getting it right.
我尝试过使用各种内容标头/边界/$_FILES/enctype 内容类型方法,但我什至无法将其正确发送到脚本.
I've tried using various content header/ boundary / $_FILES / enctype content-type methods but I can't even get it to send to the script properly like that.
- 顺便说一句,我不只是发送图像数据,我还在 postParams 中发布其他值,这些值只是字符串、整数等.
有没有人对此有任何建议或知道任何好的资源?
Does anyone have any suggestions or know of any good sources out there for this?
感谢您提供的任何帮助.
Thanks for any assistance offered.
遵循以下答案中给出的建议后的当前状态(以及来自程序其他部分的更多信息):
Current state after following advice given in answers below (also, further information from other parts of program):
图像的初始捕获:
- (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.
where the signatureDrawView is a UIView and the form.signature is a 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:@"
--%@
",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="file"; filename="%@.png"
", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[@"Content-Type: application/octet-stream
" dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[NSData dataWithData:imageData]];
[postbody appendData:[[NSString stringWithFormat:@"
--%@--
",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 看起来像:
upload.php looking like:
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 转储显示空值.
This is giving me the {success:NO} output and the $upload_array dump shows null values.
推荐答案
下面的代码,求帮助
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:@"
--%@
",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name="userfile"; filename="%@.jpg"
", filename] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[@"Content-Type: application/octet-stream
" dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[NSData dataWithData:myData]];
[postbody appendData:[[NSString stringWithFormat:@"
--%@--
",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);
相关文章