我有以下html表单:
<form method="post" action="http://shk.ecomd.de/up.php" enctype="multipart/form-data">
<input type="hidden" name="id" value="12345" />
<input type="file" name="pic" />
<input type="submit" />
</form>
以下iPhone SDK提交方法:
- (void)sendfile {
UIImage *tempImage = [UIImage imageNamed:@"image.jpg"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
[request setURL:[NSURL URLWithString:@"http://url..../form.php"]];
NSString *boundary = @"------------0xKhTmLbOuNdArY";
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:NSASCIIStringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"id\"\r\n\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"12345" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n%@\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"pic\"; filename=\"photo.png\"\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[NSData dataWithData:UIImageJPEGRepresentation(tempImage, 90)]];
[body appendData:[[NSString stringWithFormat:@"\r\n%@",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
// setting the body of the post to the reqeust
[request setHTTPBody:body];
NSError *error;
NSURLResponse *response;
NSData* result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString* aStr = [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease];
NSLog(@"Result: %@", aStr);
[request release];
}
这不起作用,但我不知道为什么。你能帮我么?!!我做错了什么?
答案 0 :(得分:3)
看起来您的请求缺少终止边界标记。根据RFC 2046,多部分mime消息的每个部分都需要在边界标记之前。最后一部分需要用最终的边界标记来关闭。最后的边界标记附加了“ - ”,表示没有任何部分跟随。试试这段代码:
- (void)sendfile {
UIImage *tempImage = [UIImage imageNamed:@"image.jpg"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
[request setURL:[NSURL URLWithString:@"http://url..../form.php"]];
NSString *boundary = @"------------0xKhTmLbOuNdArY";
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:NSASCIIStringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"id\"\r\n\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"12345" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n%@\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name=\"pic\"; filename=\"photo.png\"\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSASCIIStringEncoding]];
[body appendData:[NSData dataWithData:UIImageJPEGRepresentation(tempImage, 90)]];
[body appendData:[[NSString stringWithFormat:@"\r\n%@",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
// setting the body of the post to the reqeust
[request setHTTPBody:body];
//add terminating boundary marker
[body appendData:[[NSString stringWithFormat:@"\r\n%@--",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
NSError *error;
NSURLResponse *response;
NSData* result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString* aStr = [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease];
NSLog(@"Result: %@", aStr);
[request release];
}
答案 1 :(得分:0)
下载http://www.charlesproxy.com/
尝试从浏览器和iPhone模拟器执行相同的POST操作,看看有什么不同。
答案 2 :(得分:0)
您将文件名设置为photo.png
,但使用的是JPEG数据。可能是这个问题吗?
答案 3 :(得分:0)
<?php
require_once '__config.php';
if ($_FILES) {
if ($_FILES['pic']['type']=="image/jpeg" && intval($_POST['id'])>0) {
copy($_FILES['pic']['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/u/'.intval($_POST['id']).'.jpg');
$query="update tleistung set bild=1 where id=".intval($_POST['id']);
$res=$db->exec($query);
die('/u/'.intval($_POST['id']).'.jpg');
}
}
die("nicht erfolgreich!");
?>
这是PHP代码,我总是得到“nicht erfolgreich!”
并且没有:我将文件名更改为photo.jpg - 没有变化......
我监控了请求并获得了以下POST:
POST /up.php HTTP/1.1
Host: url...
User-Agent: iDeXs/0.97 CFNetwork/445.6 Darwin/10.3.0
Content-Type: multipart/form-data; boundary=------------0xKhTmLbOuNdArY
Referer: http://url.../up.php
Content-Length: 380606
Accept: */*
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive
------------0xKhTmLbOuNdArY
Content-Disposition: form-data; name="id"
12345
------------0xKhTmLbOuNdArY
Content-Disposition: form-data; name="pic"; filename="photo.jpg"
Content-Type: image/jpeg
ˇÿˇ‡