2012-06-25 26 views
3

我知道傳統上應用程序要與互聯網交互,它必須使用Web服務來交換信息。但是,如何從應用程序上傳數據(照片,文字,錄音等等)到服務器(其中包含所有用戶帳戶的數據)?我知道有些人從研究中採用電子郵件到服務器的策略,但即使這樣,它聽起來也是無效和緩慢的。 Instagram如何上傳這麼快?我試圖複製這種上傳。請指導我正確的方向。在IOS上從應用程序到服務器

感謝您的幫助!

+0

我已經交換信息與一個Web服務器,但是,不幸的是我不知道是什麼,甚至在上傳因此問題 –

+0

我已經更新了我的答案與您展示如何Instagram的是這樣做的;-) –

回答

4

你一定要考慮AFNetworking。這裏是我的圖像上傳到PHP的Web服務的一個例子:

NSData *imageData = UIImagePNGRepresentation(pageImage); 

AFHTTPClient *client= [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://www.SERVER.com"]]; 


//You can add POST parameteres here 
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: 
         author, @"author", 
         title, @"title", 
         nil]; 

NSMutableURLRequest *request = [client multipartFormRequestWithMethod:@"POST" path:@"/PATH/TO/WEBSERVICE.php" parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { 

//This is the image 
    [formData appendPartWithFileData: imageData name:@"cover_image" fileName:@"temp.png" mimeType:@"image/png"]; 


}]; 



AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

//Setup Upload block to return progress of file upload 
[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
    float progress = totalBytesWritten/(float)totalBytesExpectedToWrite; 
    NSLog(@"Upload Percentage: %f %%", progress*100); 
}]; 




//Setup Completeion block to return successful or failure 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSString *response = [operation responseString]; 
    NSLog(@"response: [%@]",response); 
    //Code to run after webservice returns success response code 

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"error: %@", [operation error]); 
    //Code to Run if Failed 

}]; 

[operation start]; 

編輯 -我也用MBProgressHUD顯示給用戶上傳的上傳較長。

0

在我看來,用你的第一句話,你基本上回答了你自己的問題。

您需要在您的服務器上接收文件,然後編寫客戶端代碼進行匹配。它可以像ftp一樣簡單,也可以像自定義協議一樣複雜,具體取決於您需要的安全和控制。

+0

哈哈我一個鏈接重這樣猜測,但電子郵件到服務器的方法似乎很慢。 Instagram等應用程序如何直接上傳圖片並如此快速地上傳?他們是使用已知方法還是自定義上傳協議? –

1

當我發送簡單的數據到我的網絡服務器,我使用以下方法:使用ASIHttpRequest框架連接到您的服務器。在HTTP Post正文中發送數據,這在ASIHttpRequest框架中很容易實現。在發送數據之前,您需要將數據轉換爲XML或JSON(使用SBJson框架)。然後我編寫解析json或xml的php腳本,然後用自定義SQL腳本將這些數據輸入到我的數據庫中。我可以給你的代碼片段,如果你需要他們對任何這些程序......

+0

如果它不是太麻煩,你能幫我解決一些代碼片段嗎?我可以使用它! –

+0

是的,我在工作,沒有我的MacBook。但是當我幾個小時後回到家時,我會發布它。 – sunrize920

+0

我會用mkral發佈的AFNetwork。這是另一個好框架 – sunrize920

2

這是一個相當開放式的問題,但這裏有一些東西來看看:

「上傳快」依賴於用戶的連接和服務器帶寬,所以我不會介入。

您可以通過創建NSData對象並將它們附加到POST請求來上傳照片(和其他文件)。目前已經上傳的NSData而是一個UIImage轉化一噸的示例代碼,你會做到以下幾點:

NSData *imageData = UIImagePNGRepresentation(image); 

您可以使用內置的Cocoa類(NSMutableURLRequest),並與第三方網絡類做到這一點(如作爲AFNetworking - 只需向下滾動到文件上傳)。

+3

謝謝你!我會對這個方向做更多的研究並嘗試我的解決方案。 –

4

如您所知,上傳速度總是與您使用的連接類型的速度相關聯。即使最好的上傳技術在連接速度較慢時也會很慢(例如GPRS或EDGE,即使3G網絡覆蓋不好也可能會變慢)。

要更快速地上傳大量數據,您可以做的一件事就是壓縮您使用ZIP或任何其他文件壓縮格式發送的數據,甚至開發您自己的壓縮算法(您可能不想這麼做) );-))。

例如,如果您想要減少HTTP/HTTPS連接的開銷,您可以編寫自己的協議進行數據交換,在客戶端/服務器端實施並更快上傳。這將是很多工作,因爲您不僅需要爲協議本身執行所有實現工作,還需要添加安全性等。但是,即使您選擇創建協議,如開頭所述,它會很慢如果連接速度慢。

更新: Mike Krieger(Instagram的聯合創始人)在那裏發表了他涵蓋你的問題的演講,正好跨過了我的路https://speakerdeck.com/u/mikeyk/p/secrets-to-lightning-fast-mobile-design?slide=1

你認爲它速度如此之快的原因是,他們在請求(在這種情況下爲Upload)完成之前正在更新UI。這就是Mike所說的「樂觀」。如果請求失敗,您仍然可以通知用戶,但同時讓他感覺很有成效,並且像請求成功完成一樣。

+0

哇,我看到了在這裏發生的錯覺! 貌似我應該這樣做:P 將查詢作爲異步調度,只是簡單地更新UI繼續向前 非常感謝! –

+0

該演示文稿非常有趣 –

相關問題