我试图在iOS 7/8上使用HTTP POST向我的服务器发送图片。 我的问题是,无论我的网站的哪个网址设置,我都会在请求上粘贴(粘贴在下面)。 我发了一封电子邮件给我的托管公司,他们告诉我这是由于标题不好。我无法弄清楚我的代码出了什么问题...我在网上的代码示例中添加了相同的边界字符串,mabe我应该没有这样做。
请帮助我!
直播代码:
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"uploadingpic.png"], 90);
self.preview.image = [UIImage imageNamed:@"uploadingpic.png"];
NSString *urlString=@"http://myCoolURL/upload.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: from-data; name=\"userfile\"; filename=\".jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString=[[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSLog(returnString);
以下是返回给NSLog的详细错误(我认为特定于我的伺服器提供者):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>400 Bad Request</TITLE>
</HEAD>
<BODY>
<H1>Bad Request</H1>
Your browser sent a request that this server could not understand.
<P>
Client sent malformed Host header
<P>
<HR>
<H1>Mauvaise Requête</H1>
Votre navigateur a envoyé une demande que ce serveur ne peut pas comprendre.
<P>
Le client a envoyé une en tête malformé
<P>
<HR>
<H1>Solicitud incorrecta</H1>
Su navegador ha enviado una solicitud que el servidor no puede entender.
<P>
El cliente ha enviado un encabezado incorrecto.
<P>
<HR>
<ADDRESS>
</ADDRESS>
</BODY>
</HTML>
<!--
- Unfortunately, Microsoft has added a clever new
- "feature" to Internet Explorer. If the text of
- an error's message is "too small", specifically
- less than 512 bytes, Internet Explorer returns
- its own error message. You can turn that off,
- but it's pretty tricky to find switch called
- "smart error messages". That means, of course,
- that short error messages are censored by default.
- IIS always returns error messages that are long
- enough to make Internet Explorer happy. The
- workaround is pretty simple: pad the error
- message with a big comment like this to push it
- over the five hundred and twelve bytes minimum.
- Of course, that's exactly what you're reading
- right now.
-->
答案 0 :(得分:0)
我对您的问题没有现成的答案,但是如果您密切关注您发送的标题与HTML中的上传表单非常相似,因为基本上它们是什么。如果您正在从应用程序中调试这些问题,那么您将浪费大量时间反复重新启动模拟器/调试设备。
我建议您首先使用发布到动态网页的简单上传表单来修复上传内容。你正在运行什么样的服务器并不清楚,但我认为它有PHP支持。所以创建form.html然后发布到file.php。确保有效。如果这不起作用,您就会知道托管公司存在一些问题。
下一步是找出它使用Firebug或更好的网络调试工具发送的标头。表单提交的工作标头始终是工作标头,因为接收脚本文件并不关心它来自哪里。这些标题也可以在您的应用中使用。
我看到服务器发生了很多事情,他们并没有使用你正在使用的相同字符串编码。您可以通过查看文本文档(如您自己未指定任何编码的HTML页面)来弄清楚字符串编码是什么。 UTF8应该没问题,但在某些情况下我不得不求助于Windows1252。想象一下,一些重要的标题字段具有已损坏的特殊字符,这些字符无法工作。
答案 1 :(得分:0)
有人在苹果devforums上发现了我的错误。 如果你检查我的代码,我在某处键入“from”而不是“form” 这么小的错误^^'
无论如何,谢谢!