将ASIHTTPRequest帖子设置为SimpleHTTPServer Python服务器?

时间:2011-02-25 04:26:32

标签: iphone python asihttprequest

我正在开发一个项目(我将不会发布到应用程序商店 - 只是为了好玩),它将通过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 :(得分: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”形式的URL的占位符?绝对确认您的Python Web服务器实际上是在看到请求。

答案 1 :(得分:1)

副手,我没有看到明显的问题,但我会尝试调用[request responseStatusCode]和[request responseStatusMessage]而不是[request responseString]。我猜测对帖子的回复没有字符串。我认为它应该返回200或类似的东西来表示成功。

您也可以尝试:

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

最后..我会看看ASIHTTPRequestConfig.h我也在使用ASI,所以我只是偷看它,它有一些应该有用的调试选项。

将0设置为1:

DEBUG_FORM_DATA_REQUEST 1
DEBUG_REQUEST_STATUS 1

如果你还没有尝试过,那应该会给你一些信息。

答案 2 :(得分:0)

您是否尝试过使用ASIFormDataRequest?

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

答案 3 :(得分:0)

你的代码中的

为什么在同一个请求中使用setData和setFile?如果要发送大文件,则应使用“setFile”而不是“setData”。然后从磁盘而不是内存中读取文件。

设置内容类型时,应设置正确的值。

  

[request setFile:path   withFileName:@ “Image.png”   andContentType:@ “图像/ JPEG”             forKey:@ “文件”];

内容类型应为image / png。

上传图片我使用此代码:

// Initilize Queue
[networkQueue setUploadProgressDelegate:statusProgressView];
[networkQueue setRequestDidFinishSelector:@selector(imageRequestDidFinish:)];
[networkQueue setQueueDidFinishSelector:@selector(imageQueueDidFinish:)];
[networkQueue setRequestDidFailSelector:@selector(requestDidFail:)];
[networkQueue setShowAccurateProgress:true];
[networkQueue setDelegate:self];

 NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"myImage.jpg"];
 url = [NSURL URLWithString:@"http://myserver/upload.php"];
 ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
 [request setPostValue:@"myImageName" forKey:@"name"]; 
 [request setFile:imagePath forKey:@"photo"];

 [networkQueue addOperation:request];
 [networkQueue go];

此外,如果您要一次上传多张照片,请使用setFile:forKey:而不是setData:forKey:。通过这种方式,ASIFormDataRequest将知道您正在发送相当数量的数据,它将从磁盘上的临时文件中流式传输请求数据,这意味着您不需要在内存中保留大量图像数据。