我正在开发一个项目(我将不会发布到应用程序商店 - 只是为了好玩),它将通过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"];
关于我可能出错的地方的任何想法?
答案 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将知道您正在发送相当数量的数据,它将从磁盘上的临时文件中流式传输请求数据,这意味着您不需要在内存中保留大量图像数据。