如何将ASIHTTPRequest的POST请求发送到SimpleHTTPServer的Python服务器?

3 投票
4 回答
2495 浏览
提问于 2025-04-16 12:30

我正在做一个项目(这个项目我不会发布到应用商店,只是为了好玩),目的是通过HTTP Post请求把一张图片从我的iPhone上传到我运行着Python脚本的服务器上,这个脚本是SimpleHTTPServer(你可以在http://ubuntuguide.net/http-server-support-uploading-files-from-windows-in-ubuntu找到)。我之前成功地用过ASIHTTP的API来处理文本字符串,但就是搞不懂怎么上传图片。目前我使用的代码是:

-(void)processRequest {

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"mySimpleHTTPServer"]]; 
    [request setFile:[UIImage imageNamed:@"Image.png"] withFileName:@"Image.png" andContentType:@"image/png" forKey:@"file"];

    [request startSynchronous]; 
    NSLog(@"%@",[request responseString]);
    NSUserDefaults *profiles = [NSUserDefaults standardUserDefaults];
    [profiles setObject:[request responseString] forKey:@"response"];
    [profiles synchronize];

    [self performSelector:@selector(endRequest) withObject:nil afterDelay:0];

}

其实,我觉得我可能出错的地方就是:

[request setFile:[UIImage imageNamed:@"Image.png"] withFileName:@"Image.png" andContentType:@"image/png" forKey:@"file"];

你们觉得我可能哪里搞错了呢?

4 个回答

0

你试过用 ASIFormDataRequest 吗?

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addData:imageData withFileName:@"mypicture.png" andContentType:@"image/png" forKey:@"photos"];
1

我一时半会儿看不出有什么明显的问题,不过我建议你试试用 [request responseStatusCode] 和 [request responseStatusMessage],而不是 [request responseString]。我猜对于一个POST请求,可能不会返回一个字符串。它应该返回200或者类似的数字来表示成功。

你也可以试试:

if(request.error) {
    NSLog("ERROR: %@",[error localizedDescription]);
}

最后,我建议你看看 ASIHTTPRequestConfig.h。我也在用ASI,所以我稍微看了一下,里面有一些调试选项应该能帮到你。

把里面的0改成1:

DEBUG_FORM_DATA_REQUEST 1
DEBUG_REQUEST_STATUS 1

如果你还没试过这些,应该能给你一些有用的信息。

2

正如 @SorinA. 提到的,你需要在 setFile:withFileName:andContentType:forKey: 的第一个参数中提供一个 文件路径。在你的例子中,你却提供了一个 UIImage 对象。

不过,最简单的解决办法可能是直接使用 setData:withFileName:andContentType:forKey:。你只需要把你的 UIImage 对象转换成 NSData 格式就可以了:

NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"Image.png"]);
[request setData: imageData
    withFileName: @"Image.png"
  andContentType: @"image/png"
          forKey: @"file"];

另外,你的 URL 看起来有点奇怪("mySimpleHTTPServer"),我猜这只是一个占位符,实际上应该是类似 "http://localhost:some_port/some_path" 这样的格式?一定要确认你的 Python 网络服务器确实收到了请求。

撰写回答