我正在开发一个iphone应用程序,并使用POST请求,我已经阅读了许多关于同一主题的文章,但仍然无法工作,我将感谢一些帮助,这是我的代码:
//turning the image into a NSData object
//getting the image back out of the UIImageView
//setting the quality to 72
NSData *image_data = UIImageJPEGRepresentation(picture, 72);
// setting up the URL to post to
NSMutableString *urlString = [[NSMutableString alloc] init];
[urlString appendString:BASE_URL];
[urlString appendString:@"mobile_services/mobile_store_services/upload_wishlist_image/"];
//[urlString appendString:@"/temp_trash/temporal.php"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSMutableData *body = [NSMutableData data];
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
// file
[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:image_data];
[body appendData:[[NSString stringWithFormat:@"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
// Text parameter1
NSString *param1 = @"parameter text";
[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"texto_prueba'"'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:param1] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
// close form
[body appendData:[[NSString stringWithFormat:@"--%@--'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// set request body
[request setHTTPBody:body];
NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if(conn){
web_data = [NSMutableData data];
}else{
NSLog(@"doesn't exist");
}
我使用的是NSURLConnectionDataDelegate协议,因此,我收到了以下方法中的数据:
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
{
//NSArray *json_data = [NSJSONSerialization JSONObjectWithData:web_data options:kNilOptions error:NULL];
NSString *returningString = [[NSString alloc] initWithData:web_data encoding:NSUTF8StringEncoding];
NSLog(@"returned string = %@", returningString);
[loadingView stopLoading];
}
我的PHP方面,只告诉我,它以这种方式收到了什么:
public function upload_wishlist_image()
{
var_dump($_REQUEST);
}
请帮忙!,PHP没有接收到任何图像数据。
看起来您已经放弃了这种技术,转而使用base64。我不怪你,因为手动创建这些请求很麻烦。将来,如果您使用AFNetworking来提出请求,生活会轻松得多。
无论如何,如果您对代码不起作用的原因感兴趣,那么第一个问题就是NSMutableURLRequest
。它非常非常接近,尽管有几个观察结果:
-
您应该使用该文件的mime类型(在本例中为
image/jpeg
),如果您不知道该文件的mime类型,则仅使用application/octet-stream
。所以你应该去掉application/octet-stream
行。 -
除最后一行外,应在二进制数据之前的每行末尾使用
'r'n
。
所以,不是:
[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/octet-stream'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: image/jpeg'r'n'r'n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
你应该有:
[body appendData:[[NSString stringWithFormat:@"--%@'r'n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name='"userfile'"; filename='"test.jpg'"'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Transfer-Encoding: binary'r'n'r'n" dataUsingEncoding:NSUTF8StringEncoding]];
其次,一旦修复了请求,PHP $_REQUEST
变量应该只包含'texto_prueba' => 'parameter text'
。如果你没有看到这一点,那么我会质疑你是如何从URL映射到PHP函数的。
但是,就你上传的图像而言,你在$_REQUEST
中找不到。userfile
参数将由$_FILES
返回,而不是由$_REQUEST
返回。
另一个,最后的观察:你正在通过UIImageJPEGRepresentation
将你的图像转换回NSData
。如果您可以获取NSData
(通过dataWithContentsOfFile
),这可能比往返UIImage
并返回NSData
要好,这将导致图像退化和元数据丢失。