objective-c - 难倒: NSURLConnection + php - key/value format issue

标签 objective-c ios ios5

我被难住了。尝试使用 NSURLConnection 发布到 php 脚本。整个下午都在做这个,所以我想是时候寻求帮助了。我已经阅读了@NSURLConnection 上的很多帖子,但我仍然没有弄清楚我的错误。

我正在上传一张图片,其中包含两个键/值对:userfileuser。我正在使用的 ObjC 代码如下。日志输出显示字符串(跳过图像数据)。我使用底部的 php 脚本在浏览器中测试我的服务器端 php:它工作正常。所以我以某种方式搞砸了 ObjC 代码。

有人看到我哪里出错了吗?

//日志输出

-----------------------------14737809831466499882746641449

Content-Disposition: form-data;

userfile=someImage&user=sleepy;

Content-Type: application/octet-stream

//对象

NSData *imageData = UIImageJPEGRepresentation(img, .5);

NSString *urlString = @"http://example.com/loader.php";
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

NSString *boundary = [NSString stringWithString:@"---------------------------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]];    
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; \r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

NSString * user = @"sleepy";

[body appendData:[[NSString stringWithString:@"userfile=someImage"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"&user=%@;\r\n", user] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

NSString * testOutput = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding];
NSLog(testOutput); // log it

[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// setting the body of the post to the reqeust
[request setHTTPBody:body];

// now lets make the connection to the web
[NSURLConnection
 sendAsynchronousRequest:request
 queue:[NSOperationQueue mainQueue]
 completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

     NSLog(@"Response: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
     [self.navigationController popToRootViewControllerAnimated:YES];

 }];

//浏览器

<?php
$directory_self = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['PHP_SELF']);
$uploadHandler = 'http://' . $_SERVER['HTTP_HOST'] . $directory_self . 'cuploader.php';

?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    <link rel="stylesheet" type="text/css" href="stylesheet.css">
    <title>Upload form</title>
</head>
<body>
<form id="Upload" action="<?php echo $uploadHandler ?>" enctype="multipart/form-data" method="post">
    <h1>
        Test 
    </h1>
    <p>
        <label for="userfile">File to upload:</label>
        <input id="userfile" type="text" name="userfile">
    </p>
    <p>
        <label for="user">User</label>
        <input id="user" type="text" name="user">
    </p>
    <p>
        <label for="submit">Press to...</label>
        <input id="submit" type="submit" name="submit" value="Upload me!">
    </p>

</form>
</body>
</html>

最佳答案

这是我用来发送 POST 数据的函数..

    -(void)sendData:(NSString*)data toServer:(NSString*)url{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSData *postData = [data dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
[request setHTTPBody:postData];
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
if(conn){
    //Connection successful
}
else{
    //Connection Failed
}

[conn release];

其中'data'字符串为@"&user=username&pass=password"等形式

为了上传图片,我添加了这个:

    NSData *jpeg = [[NSData alloc] initWithData:UIImagePNGRepresentation(image)];
//UIImageJPEGRepresentation
NSString *param = @"";
NSString *footer = [NSString stringWithFormat:@"\n--%@--\n", @"0194784892923"];

param = [param stringByAppendingString:[NSString stringWithFormat:@"--%@\n", @"0194784892923"]];
param = [param stringByAppendingString:@"Content-Disposition: form-data; name=\"userfile\";filename=\"image.png\"\nContent-Type: image/png\n\n"];
//NSLog(@"jpeg size: %d", [jpeg length]);

NSMutableData *data = [NSMutableData data];
[data appendData:[param dataUsingEncoding:NSASCIIStringEncoding]];
[data appendData:jpeg];
[data appendData:[[UserInfo retrieveSingleton].userName dataUsingEncoding:NSASCIIStringEncoding]];
[data appendData:[footer dataUsingEncoding:NSASCIIStringEncoding]];

希望这对您有所帮助。

关于objective-c - 难倒: NSURLConnection + php - key/value format issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746052/

相关文章:

ios - InvalidFirebaseData',原因 : '(setValue:)

ios5 - MPMoviePlayerController 覆盖控件在重用后不响应触摸

iphone - iCloud 的 loadFromContents - 如何处理 UIDocumentStateSavingError 和 UIDocumentStateEditingDisabled

ios - 如何从 ios 中的应用程序文件夹中按日期对 uiimages 进行排序

ios - 是否可以在iOS中检查用户是否给予(评分和评论)

ios - dispatch_get_main_queue 的奇怪行为

ios - 解析 : Is it possible to prefill local datastore?

iphone - 无法显示异步加载的纹理

ios - 在 Swift 中处理未捕获的异常 valueForUndefinedKey

ios - 打开自定义属性以更改 MGLSymbolStyleLayer 的图像