将图像从iOS应用程序上传到PHP ---不能完全正确---我缺少什么? [英] Upload image from iOS app to php --- Can't quite get it right --- What am I missing?

查看:113
本文介绍了将图像从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:@"\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如下:

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.

推荐答案

输入以下代码,可能会得到帮助

Put following code, may you get help

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

这篇关于将图像从iOS应用程序上传到PHP ---不能完全正确---我缺少什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆