2011-02-25 29 views
3

我正在開發一個項目(我不會發布到應用商店 - 只是爲了好玩),它將通過HTTP Post請求將圖像上傳到我已經運行Python腳本的服務器SimpleHTTPServer(http ://ubuntuguide.net/http-server-support-uploading-files-from-windows-in-ubuntu)。過去,我已經成功地使用了ASIHTTP API來處理文本字符串,但是我無法想象如何上傳圖像。這是我目前正在使用:將ASIHTTPRequest帖子設置爲SimpleHTTPServer Python服務器?

-(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

您是否試過使用ASIFormDataRequest?

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

我用[UIImage imageNamed:@「Image.png」]作爲imageData,它崩潰了應用程序。 – startuprob 2011-03-04 01:29:07

+0

...是的,我一直在使用ASIFormDataRequest。我粘貼上面的整個方法。 – startuprob 2011-03-04 01:41:01

+0

@Rob,你說你使用的是setFile,而不是addData。 – 2011-12-29 16:25:45

0

你的代碼爲什麼你在同一個請求中使用setData和setFile?如果你發送大文件,你應該使用「setFile」而不是「setData」。然後從磁盤讀取文件而不是內存。

當您設置內容類型時,您應該設置正確的值。

[請求setFile:路徑 withFileName:@ 「Image.png」 andContentType:@ 「圖像/ JPEG」 forKey:@ 「文件」];

內容類型應該是圖片/ 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就會知道你發送了一些數據,並且它會將請求數據從磁盤上的臨時文件中流出,這意味着你不需要在內存中保存大量的圖像數據。

+0

我從來沒有使用networkQueue之前 - 我一直只使用ASIFormDataRequest本身發送簡單的字符串。這可能是正確的解決方案,但我不知道如何實現它。 – startuprob 2011-03-04 01:45:48

+0

嗨,Rob,這裏是一個使用ASINetworkQueue的例子(https://gist.github.com/150447)。在這個例子中,他們使用ASIHTTPRequest,你可以用你需要的類型改變它。 – 2011-03-04 09:24:42

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 

如果你還沒有嘗試過的,應該給你一些信息。

+0

謝謝......我需要那些調試選項! – 2011-06-30 22:55:09

2

As @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形式的URL的佔位符://本地主機:some_port/SOME_PATH「?絕對確認你的Python Web服務器實際上正在看到請求。

+0

我通過測試我的代碼與ASI 2010年晚期版本與更高版本進行了驗證。較老的一個接受NSData,並知道如何使用setFile來處理它,而較新的則需要setData!這就是爲什麼一些例子使用setFile。這是正確的答案。 – 2011-12-29 16:49:06