2011-09-01 35 views
2

我有點新的iOS開發, 我一直在閱讀和搜索,但無法找到工作的例子或 如何上傳從iphone文件到web服務器異步地爲例..NSURLConnection上傳文件asynchonrously?

我能夠同步上傳

[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

它的工作原理,但它阻止我的主線程。

NSURLConnection的有這種委託(connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)

,但我不知道如何實現它。

有人可以請指出我在正確的方向嗎?

+0

我建議你創建新的線程,你將執行'[NSURLConnection的sendSynchronousRequest:request returningResponse:nil error:nil];'。 – Nekto

+0

我已經考慮爲每次上傳創建一個線程,但是如何獲得關於上傳成功或失敗的反饋? – skeo

+0

請看我的回答,請 – Nekto

回答

2

你不能爲任務創建新的線程:

[NSThread detachNewThreadSelector:@selector(upload:) toTarget:self withObject:data]; 

而當你將完成上傳,只需調用一些實現方法在你的主線程(例如uploaded):

[self performSelectorOnMainThread:@selector(uploaded) withObject:nil waitUntilDone:NO]; 
5

線程對於這類問題不是必需的。我會建議你使用內置到NSURLConnection的異步功能:

NSURLConnection *connection = [NSURLConnection initWithRequest:request delegate:self]; 
[connection start]; 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    //Get your response, do stuff 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    //Show error, retry, etc 
} 

編輯:如果你真的希望上傳文件並希望顯示一個進度條,那麼你應該看看ASIHTTPRequest框架,您在這裏可以找到更多的信息:http://allseeing-i.com/ASIHTTPRequest/

對於上載使用ASIHTTPRequest數據POST請求,你會怎麼做:

NSURL *url = [NSURL URLWithString:@"YOUR_URL_HERE"]; 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
[request setPostValue:@"123" forKey:@"user_id"]; 
[request setData:someData withFileName:@"someData.jpg" andContentType:@"image/png" forKey:@"image"]; 
[request setProgressDelegate:self]; 
[request setDelegate:self]; 
[request startAsynchronous]; 

再次,請參閱上面的鏈接爲框架和文檔。我強烈推薦它。

+0

是的,這是更好的決定。 – Nekto

+0

尼克,請您詳細說明一下NSURLConnection的說法:通過這種方式發送NSData或jpeg文件?我可以使用這種方法異步下載,但超出了我如何設置包裝文件上傳。如果一切都失敗了,我會看看ASIHTTPResquest – skeo

+1

我會在NSData中包含NSURLConnection的示例代碼,但是我沒有這樣做,因爲我總是需要multipart-formdata,這與NSURLConnection是一場噩夢。 –

13

我設法讓上傳與NSURLConnection的異步這項工作:

-(NSURLRequest *)postRequestWithURL: (NSString *)url 

           data: (NSData *)data 
          fileName: (NSString*)fileName 
{ 

// from http://www.cocoadev.com/index.pl?HTTPFileUpload 

    //NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; 

    NSMutableURLRequest *urlRequest = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [urlRequest setURL:[NSURL URLWithString:url]]; 
    //[urlRequest setURL:url]; 

    [urlRequest setHTTPMethod:@"POST"]; 

    NSString *myboundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",myboundary]; 
    [urlRequest addValue:contentType forHTTPHeaderField: @"Content-Type"]; 


    //[urlRequest addValue: [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundry] forHTTPHeaderField:@"Content-Type"]; 

    NSMutableData *postData = [NSMutableData data]; //[NSMutableData dataWithCapacity:[data length] + 512]; 
    [postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", myboundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", fileName]dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postData appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [postData appendData:[NSData dataWithData:data]]; 
    [postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", myboundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

    [urlRequest setHTTPBody:postData]; 
    return urlRequest; 
} 

用法如下:

NSURLRequest *urlRequest = [self postRequestWithURL:urlString 
                data:aVideo.msgvid 
               fileName:filename]; 

    uploadConnection =[[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
+2

這看起來類似於我正在拾取的代碼,實際上是多部分邊界匹配。夥計,'蘭特()'。 – Potatoswatter